2014-03-03 53 views
1

我正在写一些测试,我想断言某些方法实际上调用了我已经存根的对象上的赋值方法。Rspec期望赋值(=)方法被调用

我也试着这样做:

expect(test_object.some_object[:whatever]).to receive(:=).with(some_data) #Does NOT work 

test_object.method() 

这似乎并没有工作。有没有办法让我做到这一点?


之所以这样做是,“some_object”是一个开放的结构对象,它是一个替身,我不想测试时调用外部库。

回答

0

Ruby中没有这样的“赋值方法”。当你在Ruby中为变量赋值(例如局部变量,实例变量,类变量)时,你并没有调用方法。该变量是一个对象的“容器”,并且RSpec无法跟踪是否发生对变量的赋值。

对此规则进行排序的一个例外是所谓的“setter”方法,与attr_writerattr_accessor一起使用。在这种情况下,你仍然没有一个分配方法本身,但是如果你定义一个方法如:

class MyObject 
    def my_attribute=(value) 
    ... 
    end 
end 

或使用等效attr_...电话,然后将以下代码:

MyObject.new.my_attribute = 'foo' 

将被视为

MyObject.new.my_attribute=('foo') 

,您可以存根或设置在my_attribute=方法像任何其他方法的期望。

+0

我的印象是,无论是赋值运算符和其他运营商如+, - 和*所有都为方法的简写。也许我误解了。你有什么好的参考资料可以在这里看到吗? – Automatico

+0

(要查看我的观点,请看这里:[http://ruby.about.com/od/oo/ss/Overloading-Operators.htm](http://ruby.about.com/od/oo/ ss/Overloading-Operators.htm)) – Automatico

+0

尽管许多操作符都变为方法调用,但赋值操作符是一个例外,正如您提供的参考资料中所述。 –

1

实例变量赋值可以得到验证:

# checks @whatever 
expect(assigns(test_object.some_object[:whatever])).to eq(some_data) 
test_object.method()