Rails [已解决] FactoryGirl 和 Sorcery 的测试问题

匿名 · 2013年11月08日 · 最后由 imlcl 回复于 2013年11月09日 · 2700 次阅读

实在是没能力解决,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 }

就顺利跑过了所有测试,再次说一声谢谢~

可以加个 pry.binding 调试看看

匿名 #2 2013年11月08日

#1 楼 @imlcl 弱弱的问一句,加到哪一步呢

是不是 sorcery 在保存之后会清空 password。

另外密码两个字段的校验可以加个 :on => :create

#2 楼 @francistm 如果是我,我还会试试rails c里,能不能直接 create 一个 User。 刚才没看到你说提示密码不为空…… 我会加到 expect 前面咯。如果是 build 成功,create 失败,感觉是 save 时失败。 再问一句:authenticates_with_sorcery!这个,是不是官方文档要求加的?还是怎么样?感觉这个应该是在 Controller 的……

匿名 #5 2013年11月08日

#4 楼 @imlcl 这个是 sorcery 要求加的,以确定根据当前用户的 password 随机生成 salt 和 crypted_password 值……

rails c 里面运行也都是正常的,就是测试跑不通过……

匿名 #6 2013年11月08日

#3 楼 @Rei 嘿,神奇了,加了 :on => :create 之后还真的可以了。难道 sorcery 的原理是在创建了之后,Update 了 salt 和 crypted_password 的值么…… 太感谢了!

匿名 #8 2013年11月08日

#7 楼 @imlcl 哈,仔细看才注意到例子中唯一的validates :password, :presence => true, :on => :create 有加,原来如此。

还是自己看例子不够认真仔细啊。

关键 是 on=>create 是啥意思

预构建里面的 sequenc 是啥意思?

#9 楼 @wangping :on => :create就是说只有在调用create方法时,才进行validates sequence是序列生成器,可以查FactroyGirl文档

需要 登录 后方可回复, 如果你还没有账号请 注册新账号