我正在尝试按照Perl modulino模型将模块的单元测试包含在与模块本身相同的源文件中。
#! /usr/bin/env ruby
require 'test/unit'
module Modulino
def modulino_function
return 0
end
end
class ModulinoTest < Test::Unit::TestCase
include Modulino
def test_modulino_function
assert_equal(0, modulino_function)
end
end
现在,我可以运行执行此源文件的单元测试。
但是,当我需要/从其他脚本加载它们时,它们也会运行。如何避免这种情况?
有没有更惯用的方法来实现这一点,除非不鼓励这种做法?
答案 0 :(得分:11)
就我个人而言,我从来没有听说有人试图在Ruby中这样做。这绝对不是标准做法。那说你可以利用这个技巧:
if __FILE__ == $0
# Do something.. run tests, call a method, etc. We're direct.
end
if
块中的代码只有在文件直接执行时才会执行,而不是在另一个库或应用程序需要时执行。
答案 1 :(得分:3)
在Ruby中实际上并不常见,尽管它确实不是Rails中的常见做法。
您可能遇到的一个问题与this post相同,即模块确实应该包含在类中以便测试它们。通过将模块包含在您的测试用例中来测试模块当然是可能的,但是您正在测试模块是否在混合到Test :: Unit :: TestCase时工作,而不是当它混合到更有用的东西时它会起作用。
因此单元测试应该存在于类文件中,或者如果您只是想要一般可用的方法,则使用类函数而不是模块。
答案 2 :(得分:2)
您可以使用minitest在模块源代码中包含单元测试。
试试这个例子:
class Foo < String
end
if $0 == __FILE__
require 'minitest/autorun'
require 'minitest/pride'
class FooTest < MiniTest::Unit::TestCase
def test_foo_instantiation
foo = Foo.new()
assert_instance_of Foo, foo
end
def test_foo_parent_class
foo = Foo.new()
assert_kind_of String, foo
end
end
end
这里我创建了一个名为Foo的类,它继承自String类。 然后我创建了两个单元测试。在第一次测试中,我检查我是否可以实例化 Foo类的一个对象。在第二个测试中,我检查类Foo的实例化对象是一种String。
如果此代码写在名为foo.rb的文件中,我可以使用此命令运行测试:
ruby foo.rb
Minitest执行速度很快。 “pride”模块允许您以彩色字体输出测试结果,这在眼睛上很好。
答案 3 :(得分:1)
刚刚找到一种方法可以防止在脚本需要模块时执行单元测试。 unit.rb
中的.../lib/ruby/1.8/test/
中有一个标记设置为true。
结合samg技巧(再次感谢),我们可以写:
if (__FILE__ != $0)
Test::Unit.run = true ### do not run the unit tests
end