2014-04-11 4 views
3

rspec에서 과 일치하는 방법이 있습니까? the documentation을 확인하면 anything, an_instance_ofhash_including과 같이 사용할 수있는 다른 matcher가있는 것처럼 보입니다.하지만 개체 속성의 값을 확인하는 것은 없습니다.rspec에서 인수의 속성 값과 일치

class DateParser 
    def parse_year(a_date) 
    puts a_date.year 
    end 
end 

그런 다음 나는이 같은 기대를 작성할 수 있습니다 : -

예 I이 인스턴스 방법이 있다고 가정 내가 parse_year 어떤 객체로 호출되는 것을 확인 some_matcher 원하는 무엇

dp = DateParser.new 
expect(dp).to receive(:parse_year).with(some_matcher) 

값이 2014 인 year 속성이 있습니다. rspec의 out-of-the-box 인수 matcher를 사용하여이 작업을 수행 할 수 있습니까? 아니면 사용자 지정 작업을 작성해야합니까?

답변

12

당신은 블록을 전달하고 블록 내에서 인수 (들)에 대한 기대를 설정할 수는 :

내가 인수가 귀하의 예제에서`date`을 통과하는지 테스트 할 필요가
describe DateParser do 
    it "expects a date with year 2014" do 
    expect(subject).to receive(:parse_year) do |date| 
     expect(date.year).to eq(2014) 
    end 
    subject.parse_year(Date.new(2014,1,1)) 
    end 
end 
+0

"블록"형식의 출처는 어디입니까? 문서에서 찾을 수 없습니다 https://relishapp.com/rspec/rspec-mocks/v/3-2/docs/setting-constraints/matching-arguments – duleorlovic

+1

@duleorlovic [인수를 확인하기 위해 블록 사용] (https : //relishapp.com/rspec/rspec-mocks/v/3-6/docs/configuring-responses/block-implementation#use-a-block-to-verify-arguments) – Stefan

0

아마도 전달 된 날짜에 대해 이중 값을 사용하는 것이 있습니까?

date = double() 
date.should_receive(:year) 
DateParser.new.parse_year(date) 

당신이 2014 년이 될 필요 날짜가 무엇을 의미하는지 분명하지 않다하지만 이중에서 해당 동작을 취득 그것을 .and_return(2014)를 추가 할 수 있습니다.

+0

, 모두'에 응답 : 년 '* and *'date.year'의 값은 2014입니다. 나의 특별한 예에서는, 당신이 제안한 것처럼, 올해의 스텁 된 값을 반환하는 객체를 조롱 할 수 없습니다. – mralexlau