ruby-on-rails - 工厂女孩设计用户工厂无效 - 未通过 RSpec 测试

标签 ruby-on-rails rspec devise factory-bot

我是编程新手,已经学习了 Ruby on Rails 大约 11 周。

在尝试测试我的用户工厂进行验证时,我得到

  1) User has a valid factory
     Failure/Error: expect(@user.valid?).to eq(true)

       expected: true
            got: false

       (compared using ==)

我在我的用户模型中使用 Devise,在我的工厂中使用 FactoryGirl。

这是我的用户工厂:
FactoryGirl.define do 
  factory :user do
    name "John Fahey"
    sequence(:email, 100) { |n| "person#{n}@example.com" }
    password "password"
    password_confirmation "password"
    confirmed_at Time.now
  end
end

...这是我的规范
require 'rails_helper'

  describe User do 
    before do
      @user = build(:user)
    end

  it "has a valid factory" do
   expect(@user.valid?).to eq(true)
   end 
end

我一直在努力让这个规范通过一段时间。有一段时间我收到了“电子邮件已经被占用”的错误,我已经克服了这个错误。我什至让规范通过了一次,但我使用的是现在已弃用的“应该是”语法。当我转到正确的“:expect”语法时,我收到此错误。有没有人知道我在这里做错了什么?

这是我的模型
class User < ActiveRecord::Base

  #== schema information. 
  # create_table "users", force: true do |t|
  #   t.string   "name"
  #   t.string   "email",                  default: "", null: false
  #   t.string   "encrypted_password",     default: "", null: false
  #   t.string   "reset_password_token"
  #   t.datetime "reset_password_sent_at"
  #   t.datetime "remember_created_at"
  #   t.integer  "sign_in_count",          default: 0,  null: false
  #   t.datetime "current_sign_in_at"
  #   t.datetime "last_sign_in_at"
  #   t.string   "current_sign_in_ip"
  #   t.string   "last_sign_in_ip"
  #   t.string   "confirmation_token"
  #   t.datetime "confirmed_at"
  #   t.datetime "confirmation_sent_at"
  #   t.string   "unconfirmed_email"
  #   t.datetime "created_at"
  #   t.datetime "updated_at"
  # end

  # add_index "users", ["email"], name: "index_users_on_email", unique: true
  # add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true


  has_one :list
  has_many :items, through: :list
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable
end

这是我在 rails 控制台中创建用户实例并测试错误时看到的内容:
2.0.0-p576 :004 > @user = User.create
   (0.2ms)  begin transaction
   (0.2ms)  rollback transaction
 => #<User id: nil, name: nil, email: "", encrypted_password: "", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_coun
t: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, confirmation_token: nil, confirmed_at: nil, confirmation_sen
t_at: nil, unconfirmed_email: nil, created_at: nil, updated_at: nil>
2.0.0-p576 :005 > @user.save
   (1.0ms)  begin transaction
   (0.1ms)  rollback transaction
 => false
2.0.0-p576 :006 > puts(@user.errors)
#<ActiveModel::Errors:0xa7cff88>
 => nil
2.0.0-p576 :007 >

当我打印错误消息时,我得到
2.0.0-p576 :007 > puts(@user.errors.messages)
{:email=>["can't be blank"], :password=>["can't be blank"]}
 => nil

这里有一些有趣的事情。为了确保,我做了一个 rake db:migrate 和一个 rake db:test:prepare。测试通过了。然后我再次进行了精确测试,它失败了。
vagrant@rails-dev-box:~/code/blocitoff$ rake db:migrate
vagrant@rails-dev-box:~/code/blocitoff$ rake db:migrate
vagrant@rails-dev-box:~/code/blocitoff$ rake db:test:prepare
vagrant@rails-dev-box:~/code/blocitoff$ rspec spec/models/user_spec.rb
#<ActiveModel::Errors:0xbdf0740>
.

Finished in 0.1764 seconds (files took 8.96 seconds to load)
1 example, 0 failures
vagrant@rails-dev-box:~/code/blocitoff$ rspec spec/models/user_spec.rb
#<ActiveModel::Errors:0xa97066c>
F

Failures:

  1) User has a valid factory
     Failure/Error: expect(@user.valid?).to eq(true)

       expected: true
            got: false

       (compared using ==)

最佳答案

您的 email属性必须是唯一的,并且您没有在测试之间清理数据库,因此在第二次和后续执行测试时会出错。见 https://relishapp.com/rspec/rspec-rails/docs/transactions了解 RSpec 中事务的使用。

关于ruby-on-rails - 工厂女孩设计用户工厂无效 - 未通过 RSpec 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27202832/

相关文章:

ruby-on-rails - Rails 和 Devise 选项中的单表继承

ruby-on-rails - OS X Mavericks,无法安装 libxml-ruby gem?

ruby-on-rails - 如何在不覆盖路径的情况下在资源内部创建自定义路由

ruby-on-rails - Rails如何同时解决多个请求?

ruby-on-rails - 嵌入式资源中的 RSpec Controller 测试错误

ruby - 在 ruby​​ 中模拟 3rd 方对象的最佳方法是什么?

mysql - Ruby on Rails - 在 SSH 隧道查询后连接回应用程序数据库

ruby-on-rails - 如何强制 Highcharts 日期时间 X 轴上的刻度线/网格线任意与数据点对齐?

ruby-on-rails - Rspec 没有在 Linux 中加载 ControllerMacros 模块(但在 OS X 上很好)

ruby-on-rails - 为什么我的 "rails generate devise User"和 "rails generate devise_install"给我以下错误?