Добрый вечер,Возникли проблемы гася метод класса в RSpec/Rails (и с использованием динамических возвращения на корешки)
Я пытаюсь проверить довольно длинный метод в моем классе «Моделирование», который вызывает методы класса " 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? возвращает true для любого аргумента менее 75, false иначе
- is_female_alive? возвращает верно для любого аргумента меньше, чем 80, в противном случае ложной
Я попытался следующие, чтобы увидеть, если у меня есть возможность тупиковую его (simulation_spec.rb):
Age.should_receive(:is_male_alive?).exactly(89).times
results = @sim.send("generate_asset_performance")
Но я получаю следующее сообщение об ошибке:
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?
Есть ли способ, чтобы дразнить весь класс Возраст (в отличие от просто издевается один экземпляр класса Age?)
Спасибо за вашу помощь !!
UPDATE 1
Похоже есть проблема с этим методом будет вызван ... который действительно сбивает с толку. Чтобы действительно увидеть, вызвана ли она, я бросил «метод ArgumentError» в методы.
среда разработки (консоль):
1.9.3p125 :003 > sim = Simulation.last
1.9.3p125 :004 > sim.generate_results
---> ArgumentError: ArgumentError
Так что явно вызывать этот метод в среде разработки, так как он бросил ArgumentError.
Отказался от этого снова в моих тестах, и он все еще говорит, что метод не вызывался ...Я использую код ниже:
Age.should_receive(:is_male_alive?).with(an_instance_of(Fixnum)).at_least(:once) { |age| age < 75 }
Я также попытался это
Age.should_receive(:is_male_alive?).with(an_instance_of(Fixnum)).at_least(:once) { raise ArgumentError }
Любые мысли?
В ответ на ваше обновление: сложно сказать, почему этот метод не вызывается, как вы опустили большую часть вашего кода. Можете ли вы показать остальную часть тестового кода и метод «generate_results»? – Finbarr