2017-02-24 43 views
0

怎样一个模拟的是位于引用的文件通过红宝石RSpec的嘲讽实用方法

require 'myfile.rb' 

该文件的内容的实用方法是像这样。

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

目前,我有这样的:

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

我那么单元测试类我测试,它调用这个方法,但是这似乎并没有在所有嘲笑的方法。 所有帮助表示赞赏

基本上,我想模拟的方法做一些网络查询。我只想说:任何时候调用这个方法,都会返回这个散列。这种方法不是类的一部分(或者我相信)。

+0

你想为一个类的所有实例存根方法吗?你能举出一个你预期会发生什么样的代码吗? – ndn

+0

上面编辑的问题。我想模拟的方法在我正在测试的类中使用。不知道我的问题是否清楚。 – user98651

回答

1

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


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

不存根方法my_method_name。它创建一个双重(单独的对象)。如果你在它调用#my_method_name,它将与somehash回应:

x.my_method_name # => somehash 

找到方法被调用的对象。如果它很容易被替换,并且没有那么多的功能,那么你可以在它的位置传递这个double。如果不是的话,你可以通过做存根对象的方法:

said_object.stub(my_method_name: somehash) 

如果要存根它一类的所有实例,你可以这样做:

TheObjectsClass.any_instance.stub(my_method_name: somehash) 

声明:这个话题有点复杂,有待辩论。不要认为这是一个很好的测试练习,它只是旨在帮助您了解如何使用rspec。


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

0

由于要测试的类上调用此方法的人,你应该在同一类

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

我假定这方法磕碰的方法是一个实例方法。如果使用类方法,则必须在类级别存根