6

我正在尝试按照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

现在,我可以运行执行此源文件的单元测试。

但是,当我需要/从另一个脚本加载它们时,它们也会运行。如何避免这种情况?

除非不鼓励这种做法,否则是否有更惯用的方法来使用 Ruby 实现这一点?

4

4 回答 4

13

就我个人而言,我从未听说过有人试图在 Ruby 中做到这一点。这绝对不是标准做法。也就是说,您也许可以利用这个技巧:

if __FILE__ == $0
  # Do something.. run tests, call a method, etc. We're direct.
end

块中的代码if仅在文件直接执行时才会执行,而不是在另一个库或应用程序需要时执行。

更多红宝石技巧在这里:http ://www.rubyinside.com/21-ruby-tricks-902.html

于 2009-12-01T16:10:26.610 回答
3

尽管这在 Rails 中肯定不是常见的做法,但它实际上在 Ruby 中并不少见。

您可能遇到的问题之一与这篇文章相同,即模块确实应该包含在类中以便测试它们。当然可以通过将模块包含在您的测试用例中来测试它,但是您正在测试该模块在混合到 Test::Unit::TestCase 时是否有效,而不是当您将它混合到更有用的东西中时它是否有效。

因此,单元测试可能应该存在于类文件中,或者如果您只想要普遍可用的方法,请使用类函数而不是模块。

于 2009-12-01T17:08:05.140 回答
3

您可以使用 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 的实例化对象是一种字符串。

如果这段代码写在一个名为 foo.rb 的文件中,我可以简单地使用这个命令运行测试:

ruby foo.rb

Minitest 执行速度很快。“骄傲”模块允许您以彩色字体输出测试结果,这很好看。

于 2013-09-27T09:38:07.340 回答
1

刚刚找到一种方法来防止在脚本需要模块时执行单元测试。有一个标志设置为真unit.rb.../lib/ruby/1.8/test/

结合 samg 技巧(再次感谢),我们可以这样写:

if (__FILE__ != $0)
    Test::Unit.run = true  ### do not run the unit tests
end
于 2009-12-02T12:28:15.060 回答