【问题标题】:Mock Objects and Ruby's Object Hierarchy模拟对象和 Ruby 的对象层次结构
【发布时间】:2014-05-02 02:59:59
【问题描述】:

我正在使用 MiniTest 来测试一些代码。在其中一组测试中,我有一个模拟对象返回罐装数据,如下所示:

require 'minitest/autorun'
require_relative '../object_under_test'

class Foo
     def method_returning_canned_data
         return canned_data
     end
end

class TestObjectUnderTestThatReliesOnFoo < Minitest::Test
     def test_something
     end
end

稍后,我有一组测试来测试实际的 Foo 对象。

require 'minitest/autorun'
require_relative '../foo'

class TestFoo < Minitest::Test
    def test_actual_object_foo
    end
end

问题在于,如果首先运行第一组测试,则在运行实际 Foo 对象的测试时,模拟 Foo 对象在对象层次结构中是第一个并且方法被发送给它,这显然会导致测试失败(除了没有测试正确的对象!)。

问题是,当我完成后如何从 Ruby 的层次结构中删除模拟 Foo 对象?或者......有没有更好的方法来返回罐头数据进行测试?

谢谢!

【问题讨论】:

    标签: ruby object hierarchy


    【解决方案1】:

    这总是一个棘手的问题。解决它的一种快速方法是强制编译器使用load 而不是require 加载foo 文件:

    load '../foo.rb' #note the presence of the file extension
    

    然而,给你的模拟类赋予不同的名字并使用依赖注入来指示你的被测对象应该与哪个类交互通常是一个更好的主意。

    class MockFoo
      #...
    end
    
    class ObjectUnderTest
      def method_that_depends_on_foo(foo_class = Foo)
        foo_class.do_something
        # ...
      end
    end
    

    在您的测试中,您将使用method_that_depends_on_foo(MockFoo) 调用该方法。根据您的方法实际执行的操作,可能有更好的方法来解决此问题,但关键是要考虑如何解耦类之间的严格依赖关系。如果你想单独测试它们,它们需要是可隔离的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多