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
调用。
我发现断言方法 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
调用。