我有像
这样的代码it 'transfers the account balance to the recipient' do
expect(&transaction_creator.method(:call)).to change(account, :balance_cents).by(54_321_01)
end
哪个有效,但感觉不对。我的印象是,响应call
的东西应该能够像proc或lambda一样,因为Ruby的鸭子打字。但是,如果我expect(&transaction_creator)
我得到了
wrong argument type TransactionCreator (expected Proc)
如果我expect(transaction_creator)
,我会
expected #balance_cents to have changed by 5432101, but was not given a block
有没有办法简化&transaction_creator.method(:call)
?
答案 0 :(得分:0)
只是一个猜测,但您可能需要为to_proc
定义TransactionCreator
才能使expect(&transaction_creator)
正常工作。所有&:foo
次来电Symbol#to_proc
和&transaction_creator.method(:call)
来电后Method#to_proc
。
class Foo ; end
Foo.new
[].map(&foo)
TypeError: wrong argument type Foo (expected Proc)
class Foo ; def to_proc ; -> {} ; end ; end
[].map(&foo)
=> []
此外,如果你依赖鸭子打字,你应该离开强制转换为&
的{{1}}。