Rails RSpec功能测试由于nil值而失败,模型测试通过

时间:2018-08-22 02:49:10

标签: ruby-on-rails ruby rspec

我在Rails 5.1.6中遇到了模型测试和功能测试的问题。 我的模型架构看起来像

create_table "links", force: :cascade do |t|
  t.string "link_title"
  t.string "link_url"
  t.integer "upvotes", default: 0, null: false
  t.integer "downvotes", default: 0, null: false
  ...
end

我的链接模型文件

class Link < ApplicationRecord
  def self.hottest_first
    Link.all.sort_by(&:score).reverse
  end

  def score
    upvotes - downvotes
  end
end

我的控制器看起来像

class LinksController < ApplicationController
  def index
     @links = Link.all.hottest_first
  end
end

当我运行测试套件时,所有其他测试都包括模型测试通过,但是此功能测试失败。

 RSpec.feature "User submits a link" do
   scenario "they see the page for the submitted link" do
   link_title = "This Testing Rails book is awesome!"
   link_url = "http://testingrailsbook.com"

   visit root_path
   click_on "Submit a new link"
   fill_in "Link title", with: link_title
   fill_in "Link url", with: link_url
   click_on 'Submit!'

   expect(page).to have_link link_title, href: link_url
 end

我得到的错误是

 User submits a link they see the page for the submitted link
    Failure/Error: upvotes - downvotes

 NoMethodError:
   undefined method `-' for nil:NilClass
 # ./app/models/link.rb:18:in `score'
 # ./app/models/link.rb:6:in `sort_by'
 # ./app/models/link.rb:6:in `hottest_first'
 # ./app/controllers/links_controller.rb:3:in `index'

我不知道为什么这只会使该测试失败,但会通过我的模型测试或任何其他正在查看我的API或Index的测试,其他所有测试都通过了,如果我查看控制台,它会显示downvotes和upvotes都等于0而不是nil。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

模式中的

default: 0适用于数据库列。在记录保存到数据库时,会为此值分配

模型中的方法score在未保存的link上调用。在保存之前,它不会神奇地初始化upvotesdownvotes列。

您有两个机会:在模型中实现after_create回调,将upvotesdownvotes都初始化为零值,或者简单地:

def score
  upvotes.to_i - downvotes.to_i
end

nil.to_i == 0起,您一切都准备就绪,我相信测试会通过。