change(receiver, message) 和 change { block } 有区别吗

Is there are a difference between change(receiver, message) and change { block }

我发现断言方法 change 有两种不同的使用方式

expect { createRecord.call }.to change(Record, :count).by(1)

expect { createRecord.call }.to change { Record.count }.by(1)

我试图深入研究源代码,发现如果提供块,将调用传递的块。
没有块消息将 "sent" 发送给接收者。

我想知道在某些情况下是否应该优先选择一个?

并非所有内容都如此巧妙地映射到 send 方法。例如:

expect { createRecord.call }.to change { Record.count(OtherRecord.param) }.by(1)

无法将其表示为简单 send(*args) 的地方:

expect { createRecord.call }.to change(Record, :count, OtherRecord.param).by(1)

这会在 expect 行执行时计算 OtherRecord.param,而不是在正确的前后间隔。

提供它是为了功能的完整性并让您完全控制。

简而言之,块形式 运行确切的块两次 而另一个计算参数一次并进行两次 send 调用。