Ruby rspec模拟实用方法

时间:2017-02-24 12:05:36

标签: ruby rspec mocking

如何模拟位于

引用的文件中的实用程序方法
require 'myfile.rb'

文件的内容是这样的。

public
def my_method_name(arg1, arg2, arg3)
{
  ....
}

目前,我有类似的事情:

double("mydouble", "my_method_name" => somehash)

然后,我对我正在测试的类进行单元测试,该类调用此方法,但这似乎根本不是模拟方法。 感谢所有帮助

基本上,我想模拟的方法做了一些网络查询。我只想说:无论何时调用此方法,都要返回此哈希值。这个方法不是一个类的一部分(或者我相信)。

2 个答案:

答案 0 :(得分:1)

在Ruby中,所有方法都与某些东西(模块或类)相关联。您在顶级定义的方法实际上成为Kernel的私有方法。

x = double("mydouble", "my_method_name" => somehash)

不存根方法my_method_name。它创建一个double(单独的对象)。如果您在其上调用#my_method_name,则会回复somehash

x.my_method_name # => somehash

找到调用该方法的对象。如果它很容易被替换并且没有那么多功能,你可以将它传递给它。如果不是这种情况,您可以通过执行以下操作来对该对象进行存根:

said_object.stub(my_method_name: somehash)

如果你想为一个类的所有实例存根,你可以这样做:

TheObjectsClass.any_instance.stub(my_method_name: somehash)

免责声明:该主题有点复杂,需要辩论。不要认为这是一个很好的测试实践,它只是旨在帮助您了解如何使用rspec。

你说这与网络有关。您可以考虑使用VCR来模拟实际请求。

答案 1 :(得分:0)

由于您正在测试的类是调用此方法的类,因此您应该在同一个类上对该方法进行存根

allow(<your_class_instance>).to receive(:my_method_name).and_return(<>)

我假设这个方法是一个实例方法。如果是类方法,则必须在类级别将其存根