0

我正在使用 Ruby on Rails 开发一个项目。我们有一个使用 gem 中的模块的控制器操作。这个 gem 还没有完成,它不在文件系统上。

我被告知要模拟模块以测试控制器。有没有办法在没有实际宝石的情况下对此进行测试?嘲笑“要求”电话会起作用吗?我们目前正在使用 Mocha 进行 Mocking 和 Stubbing。

有一种方法可以在 python 中模拟导入。也许有一个类似的答案来模拟红宝石中的需求。 如何模拟导入

或者请让我知道处理此问题的最佳方法是什么。

更新:告诉我模拟它的人建议添加一个存根文件,但这需要向控制器添加测试代码,我不想这样做。

更新 2:控制器使用模块中声明的方法。

4

2 回答 2

0

如果您正在编写测试来模拟方法调用,它们将会失败。例如,

controller.should_receive(:method_in_non_existent_module).with(args) #=> errors

在正确的 Red->Green TDD 场景中,这没关系,因为下一步将需要 gem/file,包含模块并在控制器中添加方法调用并使测试通过。但是您将无法通过测试,因为您不能要求该文件,因为它还不存在。

可能是开发人员要求您模拟方法,而不是在您的测试中,而是在您的实际代码中。例如,他正在编写一个 gem 'dongle-jokes',它有一种方法可以从最近的技术会议中获取最流行的 dongle 笑话。他不希望 gem 成为您完成控制器和视图的障碍,因此他要求您使用一个虚拟接口来吐出一个虚拟响应。

  1. 编写失败的测试
  2. 添加文件lib/dongle-jokes.rb
  3. 将以下内容添加到该文件中。

    module DongleJokes
      def joke
        "Dongle jokes aren't funny!"
      end
    end
    
  4. 需要文件并包含模块,使用控制器中的方法。

测试现在应该通过了。lib/dongle-jokes.rb您可以在开始使用实际 gem 时删除。

于 2013-04-05T19:40:37.580 回答
0

如果您在 Rails 中工作,则无论如何都不需要向控制器添加 require,因为当您将 gem 添加到 gemfile 时,它​​将在 Rails 启动时自动需要。

您的同事最可能的意思是您应该对模块本身进行存根。您是否使用 rspec 进行测试?如果是这样,您应该可以使用stub_const. 假设该模块被称为Payments. 然后,您可以编写如下测试代码:

before do
  stub_const("Payments", stub)
  Payments.stub(process: "payments successful")
end
于 2013-04-05T19:43:49.593 回答