如何使用Mocha存根整个模块?

时间:2015-05-05 14:20:41

标签: ruby unit-testing

我的实现中使用了一个复杂的模块,其中包含一些函数。

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

因为没有办法捕获第一个参数(我需要它们来定义下一个行为)。

1 个答案:

答案 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>