Rails - 使用Rspec和Devise测试用户模型

Har*_*M V 0 rspec ruby-on-rails devise ruby-on-rails-4

我正在尝试测试用户创建的用户模型规范

工厂/ users.rb的

FactoryGirl.define do
  factory :user do
    first_name {Faker::Name.first_name}
    last_name {Faker::Name.last_name}
    email {Faker::Internet.email}
    username {Faker::Internet.user_name}
    password {Faker::Internet.password}
  end

end
Run Code Online (Sandbox Code Playgroud)

规格/型号/ user_spec.rb

require 'rails_helper'

describe User, :type => :model do

  context "valid Factory" do
    it "has a valid factory" do
      expect(build(:user)).to be_valid
    end
  end

  context "validations" do
    before { create(:user) }

    context "presence" do
      it { should validate_presence_of :first_name }
      it { should validate_presence_of :last_name }
      it { should validate_presence_of :email }
      it { should validate_presence_of :encrypted_password }
    end

    context "uniqueness" do
      it { should validate_uniqueness_of :email }
      it { should validate_uniqueness_of :username }
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我正在使用Devise来创建USer.但我最终会遇到以下测试失败

User
  valid Factory
    has a valid factory
  validations
    presence
      should require first_name to be set
      should require last_name to be set
      should require email to be set
      should require encrypted_password to be set (FAILED - 1)
    uniqueness
      should require case sensitive unique value for email
      should require case sensitive unique value for username

Failures:

  1) User validations presence should require encrypted_password to be set
     Failure/Error: it { should validate_presence_of :encrypted_password }
       Expected errors to include "can't be blank" when encrypted_password is set to nil,
       got no errors
     # ./spec/models/user_spec.rb:18:in `block (4 levels) in <top (required)>'

Finished in 0.98827 seconds (files took 6.61 seconds to load)
7 examples, 1 failure

Failed examples:

rspec ./spec/models/user_spec.rb:18 # User validations presence should require encrypted_password to be set
Run Code Online (Sandbox Code Playgroud)

我假设encrypted_passwordDevise会在尝试创建用户时自动生成.

max*_*max 5

Devise实际上并不验证加密密码,因为如果密码是"脏"(已更改),它将在验证后动态创建.

您实际上不需要以这种方式测试加密密码,因为它是一个实现细节.您可以通过执行以下操作来测试Database authenticable是否正常工作:

it 'is database authenticable' do
  user = User.create(
     email: 'test@example.com', 
    password: 'password123',
    password_confirmation: 'password123'
  )
  expect(user.valid_password?('password123')).to be_truthy
end
Run Code Online (Sandbox Code Playgroud)

但是测试的实际价值非常低.与Devise相反,您可能希望专注于一些端到端测试(功能规范),您可以在其中测试注册的用户路径,然后登录.