Rspec期望调用assign(=)方法

时间:2014-03-03 17:46:14

标签: rspec assignment-operator stub expectations

我正在编写一些测试,我想断言某些方法实际上是在我已经存根的对象上调用赋值方法。

我试过这样做:

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

test_object.method()

这似乎不起作用。我有办法做到这一点吗?


这样做的原因是“some_object”是一个开放的struct对象,它是外部库的替身,我不想在测试时调用它。

2 个答案:

答案 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_writerattr_accessor一起使用。在这种情况下,您仍然没有自己的赋值方法,但是如果您定义了一个方法,例如:

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

或使用等效的attr_...调用,然后使用以下代码:

MyObject.new.my_attribute = 'foo'

将被视为

MyObject.new.my_attribute=('foo')

您可以像my_attribute=方法一样存根或设置期望值。