【问题标题】:Rails RSpec Test Does not Pass CorrectlyRails RSpec 测试未正确通过
【发布时间】:2016-04-22 00:30:44
【问题描述】:

我正在使用 RSpec 为 Cookbook 模型编写模型测试。每个用户has_many 食谱,每个食谱belongs_to 一个用户。为了确保在没有用户的情况下无法创建Cookbook,我编写了以下测试:

it "is invalid without a user" do
  expect(FactoryGirl.build(:cookbook, user: nil)).to be_invalid
end

但是,在运行 rspec 时,我得到以下输出:

1) Cookbook is invalid without a user
   Failure/Error: expect(FactoryGirl.build(:cookbook, user: nil)).to be_invalid
   NoMethodError:
     undefined method `cookbooks' for nil:NilClass

那么,为了测试是否引发了错误,我进行了这样的测试:

it "is invalid without a user" do
  expect{FactoryGirl.build(:cookbook, user: nil)}.to raise_error(NoMethodError)
end

但是,该测试也失败并显示以下输出:

1) Cookbook is invalid without a user
   Failure/Error: expect{FactoryGirl.build(:cookbook, user: nil)}.to raise_error(NoMethodError)
     expected NoMethodError but nothing was raised

如果它意味着什么,这里是食谱的工厂:

require 'faker'

FactoryGirl.define do
  factory :cookbook do |f|
    f.title "#{Faker::Name.first_name}'s recipes"
    f.description "#{Faker::Name.last_name}'s favorite recipes."
    f.user 1
  end
end

我应该如何编写模型测试以确保在创建Cookbook 时需要用户?

【问题讨论】:

  • 请发布您的食谱课程

标签: ruby-on-rails ruby rspec


【解决方案1】:

在您的模型中,您可能有一些验证或在回调之前调用用户模型上的bookshelves。当您在测试中调用 be_invalid 时,RSpec 会在通过 FactoryGirl 构建的对象上调用 valid?。该对象运行验证并引发错误,因为它尝试在 nil 对象(用户)上调用 bookshelves

当您测试错误引发时,它不会发生,因为没有在对象上调用 valid?。因此,如果您这样做,您的测试将引发错误:

it "is invalid without a user" do
  expect{FactoryGirl.build(:cookbook, user: nil).valid?}.to raise_error(NoMethodError)
end

但是,我不建议您仅在测试中进行更改以使其通过。在调用bookshelves 之前,您应该转到您的模型并检查用户是否存在。如果您不这样做,每当您尝试在没有用户的情况下创建 Cookbook 时,您的应用就会中断。

【讨论】:

    猜你喜欢
    • 2012-04-20
    • 2017-01-24
    • 2014-10-12
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多