簡體   English   中英

Rspec測試控制器使用局部渲染

[英]Rspec Test controller render partial with locals

我有控制器動作,例如

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

在這里,我計划測試通過渲染局部傳遞的局部變量值。
status_namestatus_updated_time

您能否讓我知道如何編寫rspecs以便在控制器中使用局部變量進行渲染。

我將變量邏輯移到單獨的方法中:

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

並測試該方法。

我想說,要測試控制器,您所追求的是一個基本的功能/集成規范,您可以在其中簡單地查找您的部件所擁有的內容。

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

我傾向於(而不是經常失敗!)使用功能規格而不是控制器規格來使我的控制器保持如此簡單,以至於它們中沒有太多要測試的東西。 有了功能規格,我覺得我的應用程序的工作方式等方面的測試使我受益匪淺。

編輯:對不起...打回車太早了:)。

對於控制器,您可以按照以下方式直接測試var值:

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%正確(再次,我不常使用它們),但我認為,如果您將控制器規范推向功能/集成規范,那應該會助您一臂之力。

你可以做類似的事情

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM