我可以通过响应RSpec变更匹配器的响应吗?

时间:2015-09-29 02:12:41

标签: ruby rspec duck-typing

我有像

这样的代码
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)

1 个答案:

答案 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}}。