我在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。任何帮助都会很棒。
答案 0 :(得分:0)
default: 0
适用于数据库列。在记录保存到数据库时,会为此值分配。
模型中的方法score
在未保存的link
上调用。在保存之前,它不会神奇地初始化upvotes
和downvotes
列。
您有两个机会:在模型中实现after_create
回调,将upvotes
和downvotes
都初始化为零值,或者简单地:
def score
upvotes.to_i - downvotes.to_i
end
自nil.to_i == 0
起,您一切都准备就绪,我相信测试会通过。