1

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

我试过这样做:

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

test_object.method()

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


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

4

2 回答 2

1

Ruby 中没有“赋值方法”之类的东西。当你在 Ruby 中给变量赋值时(例如局部变量、实例变量、类变量),你并不是在调用一个方法。变量是对象的“容器”,RSpec 无法跟踪是否发生了对变量的赋值。

该规则的一个例外是所谓的“setter”方法,与attr_writerand一起使用attr_accessor。在这种情况下,您本身仍然没有分配方法,但是如果您定义了一个方法,例如:

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

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

MyObject.new.my_attribute = 'foo'

将被视为

MyObject.new.my_attribute=('foo')

my_attribute=并且您可以像任何其他方法一样对方法进行存根或设置期望。

于 2014-03-03T23:40:51.197 回答
1

可以验证实例变量分配:

# checks @whatever
expect(assigns(test_object.some_object[:whatever])).to eq(some_data)
test_object.method()
于 2016-02-23T18:44:08.040 回答