Тест контроллера Rspec — как передать аргументы методу, который я тестирую

Я хочу проверить этот метод в моем контроллере.

def fetch_match_displayed_count(params)
  match_count = 0
  params.each do |param|
    match_count += 1 if param[1]["result"] && param[1]["result"] != "result"
  end
  match_count
end

Это тест, который я написал до сих пор.

describe "fetch_match_displayed_count" do
  it "should assign match_count with correct number of matches" do
    params = {"result_1"=>{"match_id"=>"975", "result"=>"not_match"}, "result_2"=>{"match_id"=>"976", "result"=>"match"}, "result_3"=>{"match_id"=>"977", "result"=>"not_sure"}, "result_4"=>{"match_id"=>"978", "result"=>"match"}, "result_5"=>{"match_id"=>"979", "result"=>"not_match"}, "workerId"=>"123", "hitId"=>"", "assignmentId"=>"", "controller"=>"mt_results", "action"=>"create"}
    controller.should_receive(:fetch_match_displayed_count).with(params)
    get :fetch_match_displayed_count, {params:params}
    assigns(:match_count).should == 5
  end
end

Моя проблема, кажется, заключается в этой строке get :fetch_match_displayed_count, {params:params} Метод ожидает параметры, но получает ноль.

У меня есть два вопроса.

  1. Должен ли этот метод быть в помощнике, а не в самом контроллере (согласно соглашению Rails)?

  2. Как мне отправить запрос на получение и пройти params в моем тесте?


person Huy    schedule 01.02.2013    source источник
comment
Это акция? Я предполагаю, что нет.   -  person zetetic    schedule 01.02.2013
comment
@zetetic Нет, это метод, который я вызываю в своем действии создания.   -  person Huy    schedule 01.02.2013
comment
Я смог понять это. Мне пришлось сделать метод закрытым, а затем отправить запрос на получение действия create. Тогда я могу ожидать следующее: controller.should_receive(:fetch_match_displayed_count).with(params).and_return(5)   -  person Huy    schedule 01.02.2013
comment
хех..побей меня на секунды. :)   -  person zetetic    schedule 01.02.2013


Ответы (1)


Как правило, вы должны тестировать общедоступный интерфейс вашего класса. Для контроллера это означает, что вы тестируете действия, а не вспомогательные методы.

Вы должны быть в состоянии заставить это работать, настроив один или несколько отдельных тестовых случаев, которые вызывают соответствующие действия, а затем используйте ожидание сообщения, чтобы проверить, что вспомогательный метод вызывается с правильными аргументами, или проверить, что вспомогательный метод метод делает то, что он должен делать (устанавливает правильные переменные экземпляра/перенаправления/и т. д.).

person zetetic    schedule 01.02.2013
comment
Отлично, спасибо zetetic. Ваш вопрос в моем посте помог мне решить эту проблему. - person Huy; 01.02.2013