[英]How to detect method calling with block using RSpec
我想使用RSpec检测带有块的方法调用。
Deck#split_even_number
是将数字分为偶数或奇数。 我想检测Enumerable#partition
是否被块调用。
我尝试使用Proc.new { ... }
,但是这种期望总是失败的。
我使每个Proc
实例具有不同的对象ID。
如何解决这个..?
class Deck
def split_even_numbers
@cards.partition { |card| card.even? }
end
end
describe Deck do
describe '#split_even_numbers' do
let(:deck) { Deck.new(cards) }
let(:cards) { [5, 4, 3, 2, 1] }
# this test is more desirable than to detect method calling
it do
even, odd = deck.split_even_numbers
aggregate_failures do
expect(even).to match_array([2, 4])
expect(odd).to match_array([1, 3, 5])
end
end
it do
expect(cards).to receive(:partition).with(no_args) do |&block|
expect(block).to eq(Proc.new{ |card| card.even? })
end
deck.split_even_numbers
end
end
end
使用receive
的块形式,您可以获取传递的proc的句柄。 但是,没有办法真正深入探讨该块的内容。 唯一的选择是使proc可公开访问(一种依赖注入的形式):
class Deck
ProcCallingEven = Proc.new(&:even?)
def initialize(cards)
@cards = cards
end
def split_even_numbers
@cards.partition(&ProcCallingEven)
end
end
describe Deck do
describe '#split_even_numbers' do
let(:cards) { [5, 4, 3, 2, 1] }
let(:deck) { Deck.new(cards) }
it do
expect(cards).to receive(:partition) do |&block|
expect(block).to be Deck::ProcCallingEven
end
deck.split_even_numbers
end
end
end
尽管正如注释中已经提到的那样,要测试类似的东西,只需确保代码永不更改。 但是代码总是会改变,只是结果应该是一样的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.