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