2012-01-12 81 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