如何模拟位于
引用的文件中的实用程序方法require 'myfile.rb'
文件的内容是这样的。
public
def my_method_name(arg1, arg2, arg3)
{
....
}
目前,我有类似的事情:
double("mydouble", "my_method_name" => somehash)
然后,我对我正在测试的类进行单元测试,该类调用此方法,但这似乎根本不是模拟方法。 感谢所有帮助
基本上,我想模拟的方法做了一些网络查询。我只想说:无论何时调用此方法,都要返回此哈希值。这个方法不是一个类的一部分(或者我相信)。
答案 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(<>)
我假设这个方法是一个实例方法。如果是类方法,则必须在类级别将其存根