2015-07-19 39 views
0

我想測試用戶型號規格爲用戶創建導軌 - 測試用戶模型Rspec的,並制定

工廠/ 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 

規格/型號/ 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 

我使用的設計爲用戶創造。但我結束了以下測試失敗

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 

上午假設encrypted_password將通過制定自動生成在嘗試創建用戶。

+0

我猜你應該檢查password'的'存在或嘗試給encrypted_pa​​ssword爲用戶工廠像'encrypted_pa​​ssword {法克爾:: Internet.encrypted_pa​​ssword}' – Pavan

回答

3

設計實際上不驗證加密的密碼,因爲它是在驗證後動態地創建,如果密碼是「髒」(改變)。

你實際上並不需要以這種方式來測試加密的密碼,因爲它是一個實現細節。您可以測試數據庫真僞是做類似工作正常:

it 'is databse authenticable' do 
    user = User.create(
    email: '[email protected]', 
    password: 'password123', 
    password_confirmation: 'password123' 
) 
    expect(user.valid_password?('password123')).to be_truthy 
end 

但測試的實際值是相當低的。相反與設計你你可能想專注於一些end-to-end tests (feature specs)你在哪裏測試註冊,然後登錄的用戶路徑。

2

我建議你只測試你添加的驗證,你不需要測試添加的驗證因爲它們已經過測試。