为什么FactoryGirl(:build)与Sorcery一起工作,而不是FactoryGirl(:create)?

时间:2013-05-17 20:52:36

标签: ruby-on-rails rspec factory-bot sorcery

我正在尝试为我的Rails应用设置测试。我正在使用Factory Girl和Rspec with Sorcery进行身份验证。由于某种原因,这个测试没有通过:

describe "User" do
  it "has a valid the factory" do
    user = FactoryGirl.create(:user)
    user.should be_valid 
  end
end

但是这个确实:

describe "User" do
  it "has a valid the factory" do
    user = FactoryGirl.build(:user)
    user.should be_valid 
  end
end

测试失败的错误表明密码与其确认不符,所以看起来这与Sorcery如何处理密码加密有关。

还有其他人遇到过这个问题吗?它与Sorcery如何加密密码有关吗?这是故意还是错误?

2 个答案:

答案 0 :(得分:1)

build有效,因为构建的对象确实是一个有效的对象,尽管只存在于内存中。

create无效,因为save失败。

我认为,保存失败的原因应该是激活。我没有巫术的经验,只有Devise,原则是相似的。看来Sorcery默认根据自述文件要求激活。

通过在创建后添加激活钩子,可以很容易地直接在工厂定义中修复它。

FactoryGirl.define do
  factory :user do
    # other fields
    after(:create) { |user| user.activate! }
  end
end

答案 1 :(得分:0)

好的,您必须将用户定义添加到FactoryGirl:

factory :user do
  ...
  password "foobar"
  password_confirmation "foobar"
end

你的模型看起来像:

class User < ActiveRecord::Base
  authenticates_with_sorcery!
  validates :password, confirmation: true  
  validates :password_confirmation, presence: true
end

它绝对有效。

激活或加密没有任何内容。