实在是没能力解决,Google 也搜了半时天,但毫无进展……
问题大概是这样的,我用户验证系统用的 Sorcery,测试采用 RSpec。FactoryGirl 来创建预构件。 用户模型大致如下:
# app/models/user.rb
class User < ActiveRecord::Base
authenticates_with_sorcery!
attr_accessible :username,
:password,
:password_confirmation
validates :password, :confirmation => true
validates :username, :passowrd, :presence => true
validates :username, :uniqueness => { :case_sensitive => false }
end
FactoryGirl 的预构件写法:
# spec/factories/users.rb
FactoryGirl.define do
factory :user do
sequence(:username) { |n| "test_#{n}" }
sequence(:password) { |n| "secret_#{n}" }
password_confirmation { |u| u.password }
end
end
RSpec 的测试代码:
# spec/models/user_spec.rb
describe User do
it "should valid within all attributes" do
expect(build(:user)).to be_valid
end
end
一跑 Rspec,看起来还是挺和谐的,但是如果将测试代码改为 expect(create(:user)).to be_valid
的话,就一直提示失败,说密码不能为空。可是明明在预构件里定义了密码的值,况且build(:user)
的方法就完全可以通过测试。
请问各位这是什么原因到底,非常感谢啊!
已解决,根据 @Rei 的方法,把验证规则改为:
validates :username, :presence => true
validates :password, :presence => true, :on => :create
validates :password, :confirmation => true, :on => :create
validates :username, :uniqueness => { :case_sensitive => false }
就顺利跑过了所有测试,再次说一声谢谢~