【问题标题】:How do I test that a particular template was rendered in Sinatra or Padrino?如何测试特定模板是否在 Sinatra 或 Padrino 中呈现?
【发布时间】:2014-04-09 01:56:24
【问题描述】:

假设您有两个模板:

# app/views/users/foo.haml.html
%p ...

# app/views/users/bar.haml.html
%p ...

以及呈现这些的控制器:

MyApp.controllers :users do
  get '/herp' do
    render 'users/foo'
  end
  get '/derp' do
    render 'users/bar'
  end
end

编写断言特定视图由控制器呈现的 RSpec 测试的最佳方法是什么?

理想情况下,有没有办法让测试只检查视图是否已经渲染,而不实际渲染它?

【问题讨论】:

    标签: rspec sinatra padrino


    【解决方案1】:

    您可以使用Rack::Test 来检查页面的渲染:

    RSpec.configure do |config|
      config.include Rack::Test::Methods
      # other stuff too…
    end
    
    
    describe "Getting the user's page", :type => :request do
      let(:username) { "herp" }
      before do
        get "/users/#{username}"
      end
      subject{ last_response }
      its(:status) { should == 200 }
      its(:body) { should include "Something that was on the template" }
    end
    

    一旦它起作用了,您就可以对其进行泛化以生成不同的用户名来运行规范等。

    要检查页面在没有渲染的情况下被渲染,也许你可以加倍render方法?

    【讨论】:

    • 我不想让测试成为一个字符串匹配,因为这太脆弱了:如果视图发生变化,测试应该仍然有效,因为控制器中没有任何改变。我想render 有可能翻倍,我没想到。这可能是最好的方法。
    • @JohnFeminella 好吧,渲染的输出毕竟是一个字符串 :) 您可能还想在模板上运行某种有效性检查,因为如果不实际运行它,您将不知道是否模板的问题会导致渲染器出错。
    • 我同意它也是一个字符串匹配,但是当我编辑视图的内容时这个字符串不会改变。 :)
    • @JohnFeminella 我的观点是,有时测试需要与特定的东西联系起来,即使它引入了脆弱性,因为它就是这样。我经常介绍这些规格,你必须在某个地方付钱给吹笛者:)
    猜你喜欢
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2021-05-14
    • 2011-07-25
    相关资源
    最近更新 更多