2012-01-12 66 views
5

我不知道如何驗證傳遞給渲染模板控制器如何驗證呈現模板rspec的

控制器當地人當地人:

def lelf_panel 
    # ... 
    if some_condition 
    locals_hash = some_very_long_hash_A 
    else 
    locals_hash = some_very_long_hash_B 
    end 
    render :partial => "left_panel", :layout => false, :locals => locals_hash 
end 

電流規格:

it 'should render correct template for lelf_panel' do 
    # ... 
    get 'left_panel' 
    response.should render_template('system/_left_panel') 
end 

現在我需要完成此控制器的Rcov,因此我需要添加/修改規範以涵蓋'some_condition'結果。我想驗證傳遞給渲染的'lelf_panel'局部變量,就好像我只驗證render_template一樣,爲兩個結果渲染的局部頁面都是相同的。

我檢查 在rspec的文檔的「render_template」 http://rubydoc.info/gems/rspec-rails/2.8.1/RSpec/Rails/Matchers/RenderTemplate:render_template

只提供信息和消息第2 PARAMS,所以我怎麼能測試通過渲染當地人?

回答

1

據我所知,沒有辦法以你描述的方式直接檢查模板的當地人。

您可以將locals_hash更改爲@locals_hash,然後通過分配(:locals_hash)檢查結果。

或者,您可以對生成的HTML使用選擇器,並檢查是否存在某些指示性內容 - 例如,如果locals_hash影響頁面標題,請檢查生成的HTML頁面標題是否符合您的期望。

14

而不是使用render_template匹配器,您可以使用控制器對象的期望值。

it 'should render correct template for lefl_panel' do 
    # ... 
    allow(controller).to receive(:render).with no_args 
    expect(controller).to receive(:render).with({ 
    :partial => 'system/_left_panel', 
    :layout => false, 
    :locals => some_very_long_hash_A 
    }) 
    get 'left_panel' 
end 
+0

這爲我工作 - 但只有在我將should_receive註釋後的get命令後,我還需要添加controller.stub(:render)以避免錯誤 - 但我不知道爲什麼。 – Phantomwhale 2013-02-05 01:56:05

+1

這是高級答案。更改應用程序以適應測試庫的需求是一種代碼味道。 – user94154 2014-06-24 15:50:22

+0

@Phantomwhale我只是碰到了你遇到的同樣的錯誤。問題是我們的期望不會呈現或重定向任何東西,所以在動作結束時調用默認渲染。這對於rspec來說很好,但現在還沒有得到滿足。 – 2014-12-05 19:00:32

1

同@的評論瑞恩 - 阿赫恩「與建議,由@ user2490003的答案」 - 但所有投入的東西更加靈活和RSpec的3

# Safe to set globally, since actions can either render or redirect once or fail anyway 
    before do 
    allow(controller).to receive(:render).and_call_original 
    end 

    describe "get left panel" do 
    before do 
     # other setup 
     get 'left_panel' 
    end 

    it 'should render correct template for lelf_panel' do 
     # Sadly, render_template is primitive (no hash_including, no block with args, etc.) 
     expect(subject).to render_template('system/_left_panel') 
    end 

    it 'should render with correct local value' do 
     expect(controller).to have_received(:render) do |options| 
     expect(options[:locals][:key_from_very_long_hash]).to eq('value_of_key_from_very_long_hash') 
     end 
    end 
    end 
+0

我發現這個是最有用的,但是,我至少在我的rails版本中改變了塊簽名(3.2,不要問);它傳遞了正在渲染的方法的名稱。例如,在我的控制器中,我有'render'索引',locals:{presenter:presenter}',並且在我的規範中我現在有'expect(controller).to has_received(:render)do | _method,options | '..休息是一樣的。 – 2017-05-28 22:25:55