ActionView :: Template :: Error:使用rspec rails进行集成测试时,nil:NilClass的未定义方法`image_url'

问题描述

我是Rails的初学者,正在尝试测试Rails应用程序

我的页面工作正常,但是在进行集成测试时,出现此错误

User signs in with username
     Failure/Error: <div class="art-img" style="background: url(<%= @article.image_url %>); background-size: 100% 100%; background-repeat: no-repeat; background-position: center">
     
     ActionView::Template::Error:
       undefined method `image_url' for nil:NilClass

这是视图模板,错误 app / view / home / index

  <div class="main-art-con">
    <div class="art-img" style="background: url(<%= @article.image_url %>); background-size: 100% 100%; background-repeat: no-repeat; background-position: center">
      <div class="content-con">
        <h5 class="art-head"><%= @article.title %></h5>
        <p class="art-con">
          <%= truncate(@article.text,length: 100) %>
        </p>
      </div>
    </div>
  </div>

这是我的家庭控制器,其中包含对象实例

class HomeController < ApplicationController
  def index
    @featured_article = Article.unscoped.order(cached_weighted_total: :desc).limit(1)
    @article = @featured_article.last
    @categories = Category.all.ordered_by_priority
  end
end

测试代码

require 'rails_helper'

feature 'User signs in' do
  background do
    User.create(name: 'Jane Doe',username: 'jodi')
  end

  scenario 'with username' do
    visit login_path

    fill_in 'Username',with: 'jodi'


    click_on 'Log in'

    expect(page).to have_content 'Log Out'
  end
end

解决方法

错误消息undefined method `image_url' for nil:NilClass似乎表明在 test 环境中@articlenil。此环境不同于 development 开发环境,并且开发环境及其类对象大概是您在浏览器中看到的。

我希望您可以通过在运行测试之前在测试环境中创建(至少)一篇文章 来解决问题:

  background do
    User.create(name: 'Jane Doe',username: 'jodi')
    Article.create(title: 'Your Title',etc...)
  end

然后,本文将以用户Jane Doe保留的相同方式保留在 test 数据库中。

顺便说一句,您的功能测试似乎也在隐式测试(至少)索引的两个功能:与文章关联的图像的存在和“注销”按钮的存在。如果可能,请考虑将这两个测试分开,或者至少对两者进行明确的测试。