我的实现中使用了一个复杂的模块,其中包含一些函数。
disabled_color
我想把它留在我的班级:
module A
def function some_params
#returns some chain object
end
end
#implementation
class SomeImplementation
def some_function some_params
A.function(some_params_other).function1
end
end
我怎么做?特别是如何使用Mocha替换A成为我的班级。有什么想法吗?我不能这样做:
class AStub
def function params
#rely on params
do_something_else_return_same_object
end
def function1
other_do
end
end
因为没有办法捕获第一个参数(我需要它们来定义下一个行为)。
答案 0 :(得分:2)
要回答你的问题,这里是如何做到的(从文档和我对你的问题的理解,所以我可能会错了):
A.expects(:function).with(<some params>).returns(AStub)
A.expects(:function).with(<some other params>).returns(AnotherStub)
但恕我直言,我认为这真的归结为你想如何设计你的代码。
您基本上希望将A
替换为模拟测试,但您实际上可以使用其他技术“注入”(然后传统使用mocha)。
以下是我将使用的一些技巧:
<强> 1。使用默认参数将模块专门传递给该方法:
class SomeImplementation
def some_function <some_params>, a_obj = A
a_obj.function(some_params_other).function1
end
end
所以你需要做一些像
这样的事情SomeImplementation.new.some_function(some_params, your_test_double_for(A))
<强> 2。将模块传递给整个对象:
class SomeImplementation
def initialize(some_obj_params, a_obj = A)
@a_obj = a_obj
end
def some_function some_params
@a_obj.function(some_params_other).function1
end
end
在这种情况下你会写:
SomeImplementation.new(your_test_double_for(A)).some_function(some_params)`
另外,当给出选择时,我避免使用模块,因为当你“真正”使用TDD时,它们更难处理(“真的”我的意思是“在编码时发现紧急设计)。” / p>