Rspec测试控制器使用本地渲染部分

时间:2014-09-10 12:49:35

标签: ruby-on-rails ruby rspec-rails rspec3

我有像

这样的控制器动作
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

这里我计划测试通过render partial传递的局部变量值。即
status_namestatus_updated_time

请您告诉我如何在控制器中使用locals为渲染部分编写rspecs。

3 个答案:

答案 0 :(得分: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

并测试该方法。

答案 1 :(得分: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

我更喜欢在我寻求(但经常失败!)时使用控制器规格的功能规格来保持我的控制器如此简单,以至于没有太多的测试。根据功能规格,我觉得我在应用程序的工作方式等方面从测试中获得了更多,等等。

编辑:对不起......打得太早:)。

对于控制器,您可以直接测试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

对于控制器规范而言,这可能不是百分之百的实现(再次,我不会经常使用它们)但是我认为如果你去控制器规范功能/集成规范,它应该会让你顺利

答案 2 :(得分: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