RSpec:应用程序布局呈现空白

时间:2018-03-14 22:09:47

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

我正在使用可安装的引擎,这可能与此问题有关。我有一个页面,我试图测试一些内容的存在。现在,我已经硬编码了内联模板。

pagescontroller#显示:

def show
  respond_to do |format|
    format.html { 
      render inline: "<p>Dummy content</p>", layout: 'myengine/application'
    }
  end
end
来自pages_spec.rb的相关规范:

it "should have the right content" do
  visit 'my_url'
  puts "page.body:", page.body

  # right now, pagescontroller renders any layout as blank. That's why page.body is always blank
  expect(page.body).to have_content 'Dummy content'
end

当我运行规范时,我明白了:

page.body:
<html><head></head><body></body></html>
F

Failures:

  1) MyEngine::PagesController the page should have the right content
     Failure/Error: expect(page.body).to have_content 'content'
       expected to find text "content" in ""
     # ./spec/controllers/myengine/pages_spec.rb:18:in `block (3 levels) in <top (required)>'

我已经确认rails正在寻找适当位置的应用程序布局,如果我给它一个不存在的布局,它会让我知道它无法找到它。所以我知道它找到了名为/app/views/layouts/myengine/application.html.erb某事。但它没有呈现/app/views/layouts/myengine/application.html.erb中的任何内容。

如果我将pagescontroller #show中渲染行的布局注释掉为render inline: "<p>Dummy content</p>"#, layout: 'myengine/application',那么它可以正常工作。 page.body<p>Dummy content</p>

另一个注意事项:当我在浏览器中执行此操作时,它会按预期呈现应用程序布局,因此我怀疑它与RSpec有关。

为什么会发生这种情况?为什么渲染任何我给出的布局为空白?我是否需要在此处执行其他操作,因为我在可安装的引擎中测试虚拟应用程序?

修改 这是我的layouts/myengine/application.html.erb

<!DOCTYPE html>
<html>
<head>
  <title>MyEngine</title>
  <%= stylesheet_link_tag    "myengine/application", media: "all" %>
  <%= javascript_include_tag "myengine/application", "data-turbolinks-track" => true %>
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
  <%= csrf_meta_tags %>

  <% if noindex? %><meta name="robots" value="noindex" /><% end %>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>

  <% if logged_in? %>
    <%= render 'layouts/header' %>
  <% end %>

  <div id="ruler"></div>

  <% flash.each do |key, value| %>
    <script type="text/javascript">Materialize.toast('<span class="<%= key %>"><%= value %></span>', 8000);</script>
  <% end %>

  <%= yield %>

  <%= render 'layouts/footer' %>

</body>
</html>

0 个答案:

没有答案