2014-09-10 1 views
1

У меня есть действия контроллера, какRspec контроллер испытания оказывает частичным с местными жителями

def get_status 
    status_name = current_user.status 
    status_updated_time = current_user.updated_at 
    render :partial => 'show_status', :locals => {status_name: status_name, status_updated_time: status_updated_time} 
end 

здесь я планирую проверить локальные переменные значения, проходящие через визуализацию частично. i.e
status_name, status_updated_time.

Не могли бы вы дать мне знать, как писать rspecs для рендеринга частично с местными жителями в контроллере.

ответ

0

Я бы переместить переменную логику в отдельный метод:

def get_status 
    render partial: 'show_status', locals: get_status_from(current_user) 
end 

protected 

def get_status_from(user) 
    { status_name: user.status, status_updated_time: user.updated_at } 
end 

и проверить, что метод.

0

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

feature 'SomeController' do 
    background do 
    # setup data 
    # and anything else you need for authentication, etc. as your site dictates 
    end 

    scenario 'viewing the get status page' do 
    visit some_controller_get_status_path 
    expect(page).to have_text('WHATEVER IS IN THE LOCAL VAR') 
    end 
end 

Я предпочитаю использовать полнометражную функцию над контроллером спецификацией, как я ищу (но часто не!), Чтобы мои контроллеры так просто, что не очень много, чтобы проверить в них. С особенностью спецификации, я чувствую, что я получаю больше от теста с точки зрения того, как работает мое приложение и т. Д.

EDIT: извините ... нажмите Enter слишком рано :).

Для контроллера, можно непосредственно проверить значение уаг вдоль линий:

describe "Your Controller", :type => :controller do 
    describe "GET get_stuff" do 
    it "assigns a value to status_name" do 
     get :get_status 
     expect(assigns(:status_name)).to eq(['VALUE']) 
    end 
    end 
end 

Это не может быть 100% спот-для контроллера спецификации (опять же, я не использую их в много), но я думаю, что это должно помочь вам на вашем пути, если вы перейдете к спецификации контроллера или спецификации интеграции.

0

вы могли бы сделать что-то вроде

it "should render correct partial for get_status" do 
    controller.should_receive(:render).with({ 
    :partial => '_show_status', #here you will have to give the full path like <controller_name>/_show_status 
    :locals => {status_name: <name>, status_update_time: <time>} 
    }) 
    get 'get_status' 
end