좋은 저녁,문제 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를 반환합니다.
- is_male_alive :
나는 그래서이 두 가지 방법을 스텁 싶습니다? 75보다 작은 인수에 대해 true를 반환하고, 그렇지 않으면 false를 반환합니다.
- 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 }
: 나는 아래의 코드를 사용하고 있습니다?
을 : 당신이 코드의 많은 부분을 생략 한대로 메서드가 호출되지 않는 이유를 말할 어렵다. 나머지 테스트 코드와'generate_results' 메소드를 보여줄 수 있습니까? – Finbarr