是否可以使用回调方法为方法编写Rails测试?

时间:2018-05-31 15:02:56

标签: ruby ruby-on-rails-4 minitest

我想为以下方法编写测试:

class SomeObject
  def test_method
    do_something = true
    OtherObject.callback_method(do_something) do
      # test method logic
    end
  end
end

使用callback_method:

class OtherObject
  def self.callback_method(true_or_false)
    #do some global checks
    yield
  end
end

使用Minitest是否有可能以某种方式存根回调?

我希望做类似的事情:

some_object = SomeObject.new()
some_object.stub(:callback_method, true) do
  #assert method logic
end

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您可以暂时以与您希望的方式完全相同的方式存储方法。 (Docs for MiniTest::Object#stub

由于您实际想要存根的方法是OtherObject.callback_method,因此您可以将其存根为

OtherObject.stub(:callback_method,return_value) {} 

现在,当在块(OtherObject.callback_method)内调用{}时,它将返回return_value而不是实际调用该方法。因此,鉴于上面的示例,以下测试将通过:

def test_returns_true_when_I_make_it 
  test_obj = SomeObject.new
  OtherObject.stub(:callback_method,true) do 
    assert test_obj.test_method, true
  end
end

这是因为你的SomeObject#test_method返回了OtherObject.callback_method的值,所以因为我记得那个调用我真的只是测试存根工作你可以用任何相等的true值替换你想要的对象,测试仍然会通过,例如

def test_returns_foobar_when_I_make_it 
  test_obj = SomeObject.new
  OtherObject.stub(:callback_method,"foobar") do 
    assert test_obj.test_method, "foobar"
  end
end