2012-05-10 2 views
2

Добрый вечер,Возникли проблемы гася метод класса в 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.

Я хотел бы окурок эти два метода так, чтобы:

  1. is_male_alive? возвращает true для любого аргумента менее 75, false иначе
  2. 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 } 

Любые мысли?

+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

Я одобрил, но похоже, что ассер должен использовать 'stub' вместо' should_receive'. – x1a4

+0

Может также использовать. Похоже, что искатель также хочет убедиться, что сообщение получено, и заглушка не проверяет это. – Finbarr

+0

Ничего себе - это было быстро. Благодаря! Проком часть выглядит именно то, что я ищу. Тем не менее, все еще возникают проблемы с этим вызовом метода. Я думаю, должно быть что-то еще странное происходит ... Я ввел «logger.error» и «помещает» в Age.is_male_alive? метод, и он ничего не печатает во время моих тестов .... Не знаю, как это работает, если посмотреть, как результат общего моделирования проходит! Приобретенный, поскольку я уверен, что это то, что я делаю неправильно, позвольте мне понять это, хотя прежде, чем я соглашусь. – Brandon

Смежные вопросы