加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Factory Girl Devise用户工厂无效 – 未通过RS

发布时间:2020-12-16 21:04:13 所属栏目:百科 来源:网络整理
导读:我是编程新手,已经学习 Ruby on Rails大约11周了. 在尝试测试我的用户工厂进行验证时,我得到了 1) User has a valid factory Failure/Error: expect(@user.valid?).to eq(true) expected: true got: false (compared using ==) 我正在为我的用户模型使用Devi
我是编程新手,已经学习 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",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 ==)

解决方法

您的电子邮件属性必须是唯一的,并且您不会在测试之间清理数据库,因此您在测试的第二次和后续执行时遇到错误.请参阅 https://relishapp.com/rspec/rspec-rails/docs/transactions以了解RSpec中交易的使用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读