ruby-on-rails - Rails Minitest ActionView::Template::Error: nil:NilClas 的未定义方法

标签 ruby-on-rails ruby testing minitest

这两天我一直在尝试调试它,但我被卡住了。我有一个观点,我正在尝试在 Rails 中进行测试,当我在浏览器中手动测试时,该 View 工作正常,但我在 Controller 测试中不断收到此错误:

ActionView::Template::Error:nil:NilClass 的未定义方法“名称” Here is the full error message .

这是测试(test/controllers/quotes_controller_test.rb):

  test "should get quotes index as browse" do
    get browse_path
    assert_response :success
  end

它打破了我呈现这个部分的地方(views/quotes/browse.html.erb):

  <% if @recent_quotes.any? %>
    <aside class="recent-quotes browse-quotes col-7">
      <%= render @recent_quotes %>
    </aside>
  <% end %>

部分看起来像这样(views/quotes/_quote.html.erb):

<blockquote id="quote<%= quote.id %> blockquote">
  <small class="text-muted">
    <%= link_to quote.topic.name, artist_path(quote.topic) %>
  </small>
  <p class="mb-0"><%= link_to quote.content, quote_path(quote) %></p>

  <footer class="blockquote-footer">
      <cite title="Source">
        <%= link_to quote.speaker.name, quote.source %>
      </cite>
  </footer>
</blockquote>

Controller Action 看起来像这样(controllers/quotes_controller.rb):

  def browse
    @artists = Artist.all
    @recent_quotes  = Quote.all.limit(7)
  end

同样,在浏览器中一切正常,但我无法通过这个简单的测试。如果我删除它通过的部分,那么路线工作正常。我认为测试只是在第一次调用 quote.topic.name 时寻找 name 方法,但没有找到它。

但是它在浏览器中运行,所以我不知道我在这个测试中做错了什么。

最佳答案

对不起,我没有足够的评论评论,所以我会尽力回答。

你的灯具里有什么?您是否为所有 recent_quotes 定义了主题艺术家(带名字)?

fixture 绕过所有验证,因此即使您在 Quote 类中使用它,您也不会收到任何无效 fixture 的错误

在 Controller 中你有 @recent_quotes = Quote.all.limit(7)。 但是在固定装置中,您仅为 5 个引用定义演讲者和主题。 这部分:

<% 30.times do |n| %>
quote_<%= n %>:
  user: jordan
  content: <%= Faker::Lorem.unique.sentence %>
  speaker_id: <%= rand(1..5) %>
  topic_id: <%= rand(6..10) %>
  created_at: <%= 42.days.ago %>
<% end %>

不起作用,因为您没有 ID 在 1..10 中的艺术家。每次 fixtures 创建实例时,ID 并不是从 1 开始设置的,你的艺术家有像 503576764 这样的 ID。所以这部分确实创建了引号,但是它们的 topic.name 是 nil,因为主题不存在。

您至少需要为 7 个灯具手动指定演讲者和主题。或者您需要删除带有 30.times 的部分 - 我不确定您是否真的需要它。通常的做法是在固定装置中使用 2-3 个实例。您可以阅读有关固定装置的更多信息 here

或者您可以将灯具更改为 factories ,它将为您提供更明确、更方便的测试记录工作。

还有一件事。在这种情况下,有一个非常简单的调试工具。只需向您的 Controller 添加几行:

 def browse
    @artists = Artist.all
    @recent_quotes  = Quote.all.limit(7)
    @recent_quotes.map do |quote| 
      # you can add all what you need in this array
      p [quote.valid?, quote.errors, quote.speaker, quote.topic] 
    end
 end

并运行测试。您将在测试输出中看到所有信息。

关于ruby-on-rails - Rails Minitest ActionView::Template::Error: nil:NilClas 的未定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48506870/

相关文章:

selenium - 如何复制浏览器崩溃以进行自动化测试

sql-server - 如何为 Web 应用程序创建用于负载测试和压力测试的模拟器

c - Ruby C 扩展,使用 Ruby 数据类型还是 native C 来提高性能?

ruby-on-rails - Rails 4 以一种形式创建同一模型的多个记录

ruby-on-rails - 2 个 sidekiq 工作线程可以处理同一个作业吗?

ruby-on-rails - Rails 'rake test' 在创建新的 Rails 项目后立即运行两次测试

ruby - 给定 ruby​​ 中的这些键,我如何对这个散列进行排序?

ruby - 为什么 each_slice 不起作用?

android - 开始测试前卸载应用程序

ruby-on-rails - 通过 application.html.erb 文件在特定页面上呈现?