Проверка переменных экземпляра в контроллере с помощью RSpec - PullRequest
7 голосов
/ 10 июня 2011

Учитывая контроллер, подобный этому, где он создает несколько переменных экземпляра для использования представлением, вы обычно проверяете, что каждая из них установлена ​​правильно? Кажется, что вы хотели бы, но это также кажется немного сложным. Какой правильный подход?

class StaffsController < ApplicationController

  def index
   set_index_vars
    @all_staff = Staff.find_staff_for_business_all_inclusive(current_business_id)
    respond_to do |format|
     format.html { render :action => "index", :locals => { :all_staff => @all_staff, :all_services => @all_services, :new_vacation => @new_vacation } }
    end
  end

  def set_index_vars
    @days_of_week = days_of_week
    @first_day_of_week = DefaultsConfig.first_day_of_week

    @all_services = Service.services_for_business(current_business_id)

    @new_vacation = StaffVacation.new
   @has_hit_staff_limit = current_user_plan.has_hit_staff_limit?
  end

end

Код также размещен на https://gist.github.com/1018190

Ответы [ 3 ]

11 голосов
/ 10 июня 2011

Если вы собираетесь написать спецификацию контроллера, то да, непременно проверьте, что переменные экземпляра назначены. Большая часть «хитрости» может быть связана с зависимостями от других моделей / библиотек, поэтому заглушите вызовы этих методов:

# air code
Staff.stub(:find_staff_for_business_all_inclusive) {array_of_staff}
controller.stub(:days_of_week) {['Monday','Tuesday',....etc...]}
DefaultsConfig.stub(:first_day_of_week) {"Monday"}
Service.stub(:services_for_business).with(some_value_for_the_current_business_id).\
  and_return(some_relevant_value)
StaffVacation.stub(:new) {something_meaningful}
controller.stub_chain(:current_user_plan,:has_hit_staff_limit?) {false}

get :index
assigns(:days_of_week).should == ['Monday','Tuesday',....etc...]
# ...etc...
1 голос
/ 10 июня 2011

Я бы разделил это следующим образом: проверьте, что index вызывает правильный метод. Затем проверьте, работает ли метод.

Так что-то вроде

describe StaffsController do
  describe "GET #index" do
    it "calls set_index_vars" do
      controller.should_receive(:set_index_vars)
      get :index
    end
    # and your usual tests ...
  end

  describe "#set_index_vars" do
    before(:each) do
      # stub out the code not from this controller
      controller.stub_chain(:current_user_plan, :has_hit_staff_limit?).and_return(false)
      .. etc ..

      controller.set_index_vars
    end
    it { assigns(:days_of_week).should == controller.days_of_week }
    it { assigns(:has_hit_staff_limit).should be_false
    # etc ..
  end
end

Надеюсь, это поможет.

0 голосов
/ 10 июня 2011

Пока у вас есть хороший охват вашего метода, вы можете проверить, что ваш метод вызывается в нужное время, с правильными значениями и т. Д. Что-то вроде:

describe StaffsController do
  describe "GET #index" do
    it "should call set_index_vars" do
      controller.should_receive(:set_index_vars)
      get :index
    end
  end

  describe "#set_index_vars" do
    it "should assign instance variables with correct values" do 
      # or wtv this is supposed to do
      get :index
      assigns(:days_of_week).should == controller.days_of_week 
      # etc ..
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...