Rspec 如何 mock update 方法更新自己?
Rspec 用来 mock 对象方法的语法如下:
allow(model).to receive(:message).and_return(result)
允许 model
接收 message
方法返回 result
结果。那么,如何来 mock update 方法更新对象自己呢?
mock update 方法更新自己
假设我们需要 mock 测试如下代码:
model = Model.find('id')
model.update!(updated: true)
# model.updated = true
其实 allow ... receive
除了 and_return
外,还可以接收 block, 我们可以在 block 里更新 model。
mock 代码片段如下:
let(:model) { double('Model', {updated: false}) }
allow(Model).to receive(:find).with('id').and_return(model)
allow(model).to receive(:update!).with(updated: true) {
allow(model).to receive(:updated).and_return(true)
}
...
expect(model.updated).to eq(true)
使用 double 而不是 OpenStruct
在上述场景中,创建 model 时使用 double 而不是 OpenStruct。double 和 OpenStruct 都可以将 Hash 的键值转化为属性值,区别在于,double 可以 mock 任何方法,而我们不能 mock OpenStruct 没有实现的方法。
如果你喜欢这篇文章,欢迎赞赏作者以示鼓励