我是编程新手,已经学习
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中交易的使用.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。