Rails: Minitest&Carrierwave ActionView::Template::Error: undefined method `file_name' for nil:NilClass

Rails: Minitest&Carrierwave ActionView::Template::Error: undefined method `file_name' for nil:NilClass

我正在尝试为一个应用程序编写测试,该应用程序使用载波进行图像上传。该应用程序正在运行。我只是从非常简单的控制器测试开始。

例如,尝试通过

测试 root 时
test "should get root" do
  get root_path
  assert_response :success
end

我收到以下错误消息:

ERROR PagesControllerTest#test_should_get_root (1.52s)
Minitest::UnexpectedError:         ActionView::Template::Error: undefined method  `file_name' for nil:NilClass
        app/views/pages/manifesto.html.erb:1
        test/controllers/pages_controller_test.rb:6:in `block in <class:PagesControllerTest>'

冒犯的观点是:

<div class="" style="background: url(<%= @hero.file_name.url(:image2000) %>) no-repeat center center; -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; background-size: cover;">
</div>

我有以下相关灯具:

page_sections.yml
one:
  title: MyString
  page: MyString
  description: MyString

two:
  title: MyString
  page: MyString
  description: MyString

...


page_section_images.yml
one:
  page_section: One
  image: One

two:
  page_section: Two
  image: Two

...

images.yml
one:
  file_name: MyString
  title: MyString
  alt: MyString
  author: MyString
  copyright: MyString

two:
  file_name: MyString
  title: MyString
  alt: MyString
  author: MyString
  copyright: MyString

我知道他在尝试渲染视图时没有获得背景图像。为什么?我必须做什么才能检验我的观点?我目前没有测试上传。正如我所说,页面呈现正确,只有测试抛出此错误。

希望有人能帮帮我。

编辑/pages_controller:

class PagesController < ApplicationController

  def manifesto
    @intro_hero = Image.joins(:page_section_images).where('page_section_images.page_section_id' => '1').order("RAND()").uniq.first
    @intro_section = PageSection.where(id: 1).select("id, description, title").first 
    @hero = Image.joins(:page_section_images).where('page_section_images.page_section_id' => '2').order("RAND()").uniq.first
    @section = PageSection.where(id: 2).select("id, description, title").first 
    ...
  end

  ...
end

在我的应用程序中,我有 11 个页面部分,因此我在 page_section 夹具中定义了 11 个条目,在 page_section_images 夹具中定义了 11 个条目。我是编写测试和设置测试的新手。

感谢 Christos-Angelos Vasilopoulos 的提示,我得以解决它。问题与我的灯具中的正确数据有关。

  1. 在我的例子中,一些控制器和模型具有与我数据库中的精确条目相关的逻辑。例如“where('page_section_images.page_section_id' => '2')”之类的东西。 在编写固定装置时,我必须在代码中使用我需要的整数值来指定 id。否则 Minitest 会写下他的值,而我的代码不会接受这些值。

  2. 我有这样的代码:“.order("RAND()").uniq.first”。为了使其可测试,我需要至少两个可以排序、随机化等的条目...

这意味着需要彻底编写 fixtures 并牢记代码。