使用Test :: Unit测试模块

时间:2009-11-18 20:54:27

标签: ruby unit-testing module testunit

尝试使用Test :: Unit测试模块时遇到问题。我以前做的是:

my_module.rb:

class MyModule
  def my_func
    5 # return some value
  end
end

test_my_module.rb:

require 'test/unit'
require 'my_module'

class TestMyModule < Unit::Test::TestCase
  include MyModule

  def test_my_func
    assert_equal(5, my_func) # test the output value given the input params
  end
end

现在的问题是,如果my_module声明了一个初始化方法,它会被包含在测试类中,这会导致一堆问题,因为Test :: Unit似乎覆盖/生成了一个初始化方法。所以我想知道测试模块的最佳方法是什么?

我也想知道我的模块应该成为一个类,因为初始化方法是为了初始化某个东西的状态。意见?

提前致谢!

2 个答案:

答案 0 :(得分:4)

在模块中包含initialize方法对我来说感觉非常错误,所以我至少会重新考虑这一点。

要回答关于更直接地将其作为模块进行测试的问题,我会创建一个新的空类,在其中包含您的模块,创建该类的实例,然后针对该实例进行测试:

class TestClass
  include MyModule
end

class TestMyModule < Unit::Test::TestCase
  def setup
    @instance = TestClass.new
  end

  def test_my_func
    assert_equal(5, @instance.my_func) # test the output value given the input params
  end
end

答案 1 :(得分:3)

是的,你的初始化肯定会暗示你正在上课。 ruby中的模块通常感觉像是其他语言的界面,只要你在包含模块时实现一些基本的东西,你就可以免费获得很多。

Enumerable是一个很好的例子,只要你定义[],当你包含Enumerable时,你会突然得到pop,push等。

所以我对测试模块的直觉是你应该测试包含模块的类而不是测试模块本身,除非模块被设计成不包含在任何东西中,它只是一个代码存储机制。