Vraag Het gebruikersmodel testen met Rspec, Devise en Factory Girl


Ik denk dat er een probleem is met de bouw van mijn gebruikersfabriek. Ik krijg een foutmelding dat het wachtwoord niet leeg mag zijn, maar het is duidelijk ingesteld in mijn fabrieken.rb. Ziet iemand iets dat ik misschien mis? Of een reden waarom de specificatie faalt? Ik doe ongeveer hetzelfde voor een van mijn andere modellen, en het lijkt succesvol te zijn. Ik weet niet zeker of de fout wordt veroorzaakt door bedenken of niet.

Rspec-fout

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)>'

Factories.rb

Factory.define :user do |user|
  user.name                   "Test User"
  user.email                  "user@example.com"
  user.password               "password"
  user.password_confirmation  "password"
end

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

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

20
2018-05-17 14:14


oorsprong


antwoorden:


In Factory Girl levert dit attributen op:

@user_attr = Factory.attributes_for(:user)

En dit maakt een nieuw exemplaar:

@user = Factory(:user)

Dus verander het bovenstaande en probeer:

User.create!(@user_attr)

Wat je grondig probeert te doen, mislukt omdat:

  • u maakte een nieuwe niet-opgeslagen instantie

  • wachtwoord is een virtueel attribuut

  • de attributen van de instantie bevatten niet de virtuele attributen (denk ik)


30
2018-05-17 14:22



De eenvoudigste benadering IMO:

FactoryGirl.modify do
  factory :user do
    after(:build) { |u| u.password_confirmation = u.password = ... }
  end
end

7
2018-04-25 18:54



Een tip die het werk voor mij deed. Ik was aan het gebruiken FactoryGirl.create(:user) wat niet werkte. Veranderde het hiernaar:

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

Dit komt misschien omdat 'wachtwoord' een virtueel veld is. Ik hoop dat dit iemand kan wijzen.


5
2018-02-04 15:44