2012-05-10 2 views
2

좋은 저녁,문제 RSpec에/레일에 클래스 메소드 스텁 (스텁 동적 수익률 사용)

내가 클래스 메소드 "를 호출 내"시뮬레이션 "클래스에 상당히 긴 방법을 테스트하기 위해 노력하고있어 데 is_male_alive? " 및 "is_female_alive?" 내 "나이"수업에서 몇 백 번. 이러한 클래스 메서드의 반환 값은 통계를 기반으로하므로 내 테스트가 매번 동일하게 실행될 수 있도록 특정 값을 반환하도록 스텁 처리하고 싶습니다.

Age.rb :

... 

def is_male_alive?(age) 
    return false if age > 119 
    if (age < 0 || age == nil || age == "") 
    return false 
    end  
    death_prob = grab_probability_male(age) 
    rand_value = rand 
    rand_value > death_prob 
end 

... 

나는 다음을 수행 내 "시뮬레이션"클래스에서

(여성 버전은 기본적으로 몇 가지 다른 상수와 동일) :

def single_simulation_run 

    ... 
    male_alive = Age.is_male_alive?(male_age_array[0]) 
    female_alive = Age.is_female_alive?(female_age_array[0]) 
    ... 
end 

본질적으로 시뮬레이션을 반복 할 때마다 (예 : is_male_alive? (56)), true 또는 false를 반환합니다.

  1. is_male_alive :

    나는 그래서이 두 가지 방법을 스텁 싶습니다? 75보다 작은 인수에 대해 true를 반환하고, 그렇지 않으면 false를 반환합니다.

  2. is_female_alive?

    Age.should_receive(:is_male_alive?).exactly(89).times 
    results = @sim.send("generate_asset_performance") 
    

    하지만 얻을 : 나는 내가 (simulation_spec.rb를) 그것을 밖으로 스텁 수있는 능력을 가지고 있는지 확인하기 위해 다음과 같은 노력했습니다 그렇지 않으면

거짓 어떤 인수 80 미만에 대해 true를 반환 다음과 같은 오류 :

Failure/Error: Age.should_receive(:is_male_alive?).exactly(89).times 
    (<Age(id: integer, age: integer, male_prob: decimal, female_prob: decimal) (class)>).is_male_alive?(any args) 
     expected: 89 times 
     received: 0 times 

나는 또한 스텁 반환 값이 동적으로 인수를 기반으로 생성되도록 그것을 설정하는 방법을 모른다. proc로이 작업을 수행 할 수있는 방법이 있습니까?

는 전체 연령 클래스를 조롱 할 수있는 방법이 있나요 (단지 나이 클래스의 단일 인스턴스를 조롱 반대로?) 당신의 도움에 대한

감사합니다! 정말 혼란 호출되는이 방법 ...에 문제가있는 것처럼

UPDATE 1

보인다. 실제로 호출되는지 확인하기 위해 메소드에 "ArgumentError"를 발생 시켰습니다.

개발 환경 (콘솔)는하면 ArgumentError을 던졌다로

1.9.3p125 :003 > sim = Simulation.last 
1.9.3p125 :004 > sim.generate_results 
    ---> ArgumentError: ArgumentError 

그래서 그것은 분명, 개발 환경에서이 메소드를 호출한다.

내 테스트에서 다시 실행하고, 여전히 메소드가 호출되지 않는다고 말하고 있습니다.나는 또한이

Age.should_receive(:is_male_alive?).with(an_instance_of(Fixnum)).at_least(:once) { raise ArgumentError } 

어떤 생각을 시도

Age.should_receive(:is_male_alive?).with(an_instance_of(Fixnum)).at_least(:once) { |age| age < 75 } 

: 나는 아래의 코드를 사용하고 있습니다?

+0

을 : 당신이 코드의 많은 부분을 생략 한대로 메서드가 호출되지 않는 이유를 말할 어렵다. 나머지 테스트 코드와'generate_results' 메소드를 보여줄 수 있습니까? – Finbarr

답변

7

블록을 사용할 수 있습니다. RSpec에의 메시지 기대 문서에서 임의 처리를 참조하십시오 : 당신의 갱신에 대한 응답으로 http://rubydoc.info/gems/rspec-mocks/frames

Age.should_receive(:is_male_alive?).with(an_instance_of(Fixnum)).at_least(:once) { |age| age < 75 } 
Age.should_receive(:is_female_alive?).with(an_instance_of(Fixnum)).at_least(:once) { |age| age < 80 } 
+2

나는 upvoted, 그러나 asker가'should_receive' 대신에'stub'을 사용해야하는 것처럼 보입니다. – x1a4

+0

둘 중 하나를 사용할 수 있습니다. 질문자가 메시지가 수신되고 스텁이이를 테스트하지 않기를 원하는 것처럼 보입니다. – Finbarr

+0

와우 - 빨리 끝났습니다. 감사! proc 파트는 내가 찾고있는 것처럼 보입니다. 그러나 여전히 메서드를 호출하지 않는 문제가 있습니다. 다른 이상한 일이있을 것 같아요. 나는 "logger.error"와 Age.is_male_alive에 "puts"을 넣었습니까? 방법과 그것은 내 테스트 동안 아무 것도 인쇄되지 않습니다 ... 어떻게 전반적인 시뮬레이션의 결과로보고 봤지만 어떻게 작동 모르겠어요! Upvoted 내가 틀린 그것의 무언가 확실하다고, 내가 받아들이 기 전에 먼저 그것을 알아낼 수있게해라. – Brandon