我正在编写一些测试,我想断言某些方法实际上是在我已经存根的对象上调用赋值方法。
我试过这样做:
expect(test_object.some_object[:whatever]).to receive(:=).with(some_data) #Does NOT work
test_object.method()
这似乎不起作用。我有办法做到这一点吗?
这样做的原因是“some_object”是一个开放的struct对象,它是外部库的替身,我不想在测试时调用它。
答案 0 :(得分:1)
可以验证实例变量分配:
# checks @whatever
expect(assigns(test_object.some_object[:whatever])).to eq(some_data)
test_object.method()
答案 1 :(得分:0)
Ruby中没有“赋值方法”这样的东西。当您为Ruby中的变量赋值(例如局部变量,实例变量,类变量)时,您不会调用方法。变量是对象的各种“容器”,RSpec无法跟踪是否发生对变量的赋值。
此规则的排序的一个例外是所谓的“setter”方法,与attr_writer
和attr_accessor
一起使用。在这种情况下,您仍然没有自己的赋值方法,但是如果您定义了一个方法,例如:
class MyObject
def my_attribute=(value)
...
end
end
或使用等效的attr_...
调用,然后使用以下代码:
MyObject.new.my_attribute = 'foo'
将被视为
MyObject.new.my_attribute=('foo')
您可以像my_attribute=
方法一样存根或设置期望值。