直接与大脑交互并不容易,所以我使用了一些网关模式和一些依赖倒置。
NumberCruncher
是我Brain
班级的包装。
class NumberCruncher
def initialize brain = Brain.new
@brain = brain
end
def times_one_hundred *numbers
numbers.map &@brain.method(:multiply_by_100)
end
end
我在测试时遇到错误:
NameError:类“Mocha::Mock”的未定义方法“multiply_by_100”
这是测试
class NumberCruncherTest
def setup
@brain = mock
@cruncher = NumberCruncher.new @brain
end
def test_times_one_hundred
@brain.expects(:multiply_by_100).with(1).returns(100)
@brain.expects(:multiply_by_100).with(2).returns(200)
@brain.expects(:multiply_by_100).with(3).returns(300)
assert_equal [100, 200, 300], @cruncher.times_one_hundred(1,2,3)
end
end
我假设这是因为&@brain.method(:multiply_by_100)
电话和摩卡咖啡通过使用method_missing
或其他东西起作用。唯一的解决方案似乎是更改设置
class NumberCruncherTest
class FakeBrain
def multiply_by_100; end
end
def setup
@brain = FakeBrain.new
@cruncher = NumberCruncher.new @brain
end
# ...
end
但是,我认为这种解决方案很糟糕。它很快就变得一团糟,并且Fake*
在我的测试中放置了大量的课程。有没有更好的方法来用摩卡做到这一点?