【问题标题】:Rails 3 - How do I test a controller module?Rails 3 - 如何测试控制器模块?
【发布时间】:2011-08-04 10:51:15
【问题描述】:

我有 3 个包含相同模块的控制器。

如何使用 Test:Unit 将模块集中在一个地方进行测试?

我应该为每个控制器编写 3 个相同的功能测试(不是 DRY)吗?

TestController/TestController1/TestController2:

class TestController < ApplicationController
 include TestModule

 test_module :test, :only => [:index]
 ...
end

测试模块:

module TestModule
 extend ActiveSupport::Concern

 module ClassMethods
  private

  def test_module(resource, options = {})
   self.before_filter(options.slice(:only, :except)) do
     puts 'test_module'
   end
  end
 end
end

提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 unit-testing testunit


    【解决方案1】:

    控制器测试应该准确地测试……控制器。因此,您为控制器编写的任何测试都应验证控制器操作是否完全符合您的预期,无论您为它们添加了哪些模块来完成它们的工作。将它们视为一个黑匣子,您所关心的只是为控制器提供一些输入,然后验证输出是否为它们应该是的。

    您应该将模块作为它自己的实体进行测试,编写模型和测试以充分验证每个模块方法。您的控制器将来可能会更改,因此您将始终拥有模块的测试覆盖率。

    【讨论】:

    • 感谢您的回答。我将为我的控制器编写测试。但是如何为我的模块编写隔离测试(使用 Test:Unit)?我必须模拟一个控制器?如果是这样,我应该把这些测试放在哪里,等等?
    • 这样想:为模块编写测试有点像为模型编写测试。他们都只是在他们里面有方法。因此,当您调用或将参数传递给方法时,您期望该方法产生特定结果,这就是您应该在模块中测试的结果。因此,如果我打电话给TestModule.create_something_amazing 并期望它为我创造一些惊人的东西,那么测试应该验证它是否符合我的期望。这些测试应该放在 Unit/lib 文件夹中,因为按照惯例,您的模块应该放在 Rails 应用程序的 lib 目录中
    • 我确实像你说的那样测试了我的模型模块。但我不明白如何测试这个特定的模块。因为它是控制器的类方法。我需要控制器实例来验证它的完整性,但我不明白我该怎么做。我不能只在单元测试中调用 test_module 方法,它不起作用:(
    【解决方案2】:

    您可能想学习使用标准工具(例如 RSpec)来测试控制器。

    这是Ryan Bates' Railscast的链接

    【讨论】:

    • 好吧,我知道如何测试控制器,在这种情况下,我只想弄清楚如何为这个控制器模块编写隔离测试。
    猜你喜欢
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多