使用Rspec,Devise和Factory Girl测试用户模型

ard*_*vis 20 ruby rspec ruby-on-rails devise factory-bot

我认为我的用户工厂正在构建中存在问题.我收到一个错误,说密码不能为空,但它明确地设置在我的workers.rb中.有没有人看到我可能遗失的任何东西?或者为什么规范失败的原因?我为其他一个模型做了一个非常类似的事情,它似乎很成功.我不确定错误是否是由设计引起的.

Rspec错误

User should create a new instance of a user given valid attributes
Failure/Error: User.create!(@user.attributes)
ActiveRecord::RecordInvalid:
  Validation failed: Password can't be blank
# ./spec/models/user_spec.rb:28:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)

Factories.rb

Factory.define :user do |user|
  user.name                   "Test User"
  user.email                  "user@example.com"
  user.password               "password"
  user.password_confirmation  "password"
end
Run Code Online (Sandbox Code Playgroud)

user_spec.rb

require 'spec_helper'

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

  it "should create a new instance of a user given valid attributes" do
    User.create!(@user.attributes)
  end
end
Run Code Online (Sandbox Code Playgroud)

user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
end
Run Code Online (Sandbox Code Playgroud)

apn*_*ing 30

在Factory Girl中,这创建属性:

@user_attr = Factory.attributes_for(:user)
Run Code Online (Sandbox Code Playgroud)

这创建了一个新实例:

@user = Factory(:user)
Run Code Online (Sandbox Code Playgroud)

所以改变上面并尝试:

User.create!(@user_attr)
Run Code Online (Sandbox Code Playgroud)

深入,你想要做的事情失败是因为:

  • 您正在创建一个新的未保存的实例

  • password是一个虚拟属性

  • 实例的属性不包含虚拟属性(我猜)


Isa*_*esh 7

最简单的方法IMO:

FactoryGirl.modify do
  factory :user do
    after(:build) { |u| u.password_confirmation = u.password = ... }
  end
end
Run Code Online (Sandbox Code Playgroud)


kod*_*ode 5

一个提示为我做的工作.我用的FactoryGirl.create(:user)是没用的.将其改为:

user = FactoryGirl.build(:user)
user.password = "123456"
user.save
post :login, {:email => user.email, :password => "123456"}
# do other stuff with logged in user
Run Code Online (Sandbox Code Playgroud)

这可能是因为'密码'是一个虚拟领域.希望这可能暗示某人.