tsd*_*own 47 ruby testing unit-testing module ruby-on-rails
我想知道如何为一个混合成几个类的模块编写单元测试但是不太知道如何去做:
我是通过在其中一个测试文件中为包含它们的类(似乎不对)编写测试来测试实例方法,还是以某种方式将所包含方法的测试保存在特定于模块的单独文件中?
同样的问题适用于类方法.
我是否应该为模块中的每个类提供单独的测试文件,例如普通的rails模型,或者它们是否存在于通用模块测试文件中(如果存在的话)?
cwn*_*nja 57
恕我直言,您应该进行功能测试覆盖,涵盖模块的所有用途,然后在单元测试中单独测试:
setup do
@object = Object.new
@object.extend(Greeter)
end
should "greet person" do
@object.stubs(:format).returns("Hello {{NAME}}")
assert_equal "Hello World", @object.greet("World")
end
should "greet person in pirate" do
@object.stubs(:format).returns("Avast {{NAME}} lad!")
assert_equal "Avast Jim lad!", @object.greet("Jim")
end
Run Code Online (Sandbox Code Playgroud)
如果你的单元测试是好的,你应该能够在它混合的模块中测试功能.
编写一个测试助手,断言正确的行为,然后对它混入的每个类使用它.用法如下:
setup do
@object = FooClass.new
end
should_act_as_greeter
Run Code Online (Sandbox Code Playgroud)
如果你的单元测试是好的,这可以是对预期行为的简单冒烟测试,检查正确的代表被调用等.
Jul*_*lik 13
使用内联类(我没有做任何花哨的flexmock或stubba/mocha用法只是为了表明这一点)
def test_should_callout_to_foo
m = Class.new do
include ModuleUnderTest
def foo
3
end
end.new
assert_equal 6, m.foo_multiplied_by_two
end
Run Code Online (Sandbox Code Playgroud)
任何模拟/存根库都应该为您提供更清晰的方法.你也可以使用结构:
instance = Struct.new(:foo).new
class<<instance
include ModuleUnderTest
end
instance.foo = 4
Run Code Online (Sandbox Code Playgroud)
如果我有一个在很多地方使用的模块,我有一个单元测试就可以做到这一点(在模块方法下滑动测试对象并测试模块方法是否在该对象上正常工作).
我喜欢做的是创建一个新的主机类并将模块混合到其中,如下所示:
describe MyModule do
let(:host_class) { Class.new { include MyModule } }
let(:instance) { host_class.new }
describe '#instance_method' do
it 'does something' do
expect(instance.instance_method).to do_something
end
end
end
Run Code Online (Sandbox Code Playgroud)