rspec mongoid 验证的唯一性



我想测试用户模型的单性。

我的User模型类如下所示:

class User
  include Mongoid::Document
  field :email, type: String
  embeds_one :details
  validates :email,
      presence: true,
      uniqueness: true,
      format: {
        with: /A([^@s]+)@((?:[-a-z0-9]+.)+[a-z0-9]{2,})Z/i,
        on: :create
      },
      length: { in: 6..50 }
end

属于该模型的 rspec 测试如下所示:

...
before(:each) do
  FactoryGirl.create(:user, email: taken_mail)
end
it "with an already used email" do
  expect(FactoryGirl.create(:user, email: taken_mail)).to_not be_valid
end

执行bundle exec rspec后,它总是引发下一个错误,而不是成功传递:

Failure/Error: expect(FactoryGirl.create(:user, email: taken_mail)).to_not be_valid
     Mongoid::Errors::Validations:
       Problem:
         Validation of User failed.
       Summary:
         The following errors were found: Email is already taken
       Resolution:
         Try persisting the document with valid data or remove the validations.

如果我使用它,它会成功通过:

it { should validate_uniqueness_of(:email) }

我想使用expect(...).有人可以帮助我吗?

问题是您正在尝试将无效对象保存到数据库中,这会引发异常并中断测试(因为电子邮件不是唯一的(,甚至在使用 expect 方法完成测试之前。

正确的方法是在此处使用 build 而不是 create,后者不会将对象保留在数据库中,方法是仅在内存中构建记录并允许测试完成其工作。因此要修复它:

expect(FactoryGirl.build(:user, email: taken_mail)).to_not be_valid

另请注意,如果您不需要实际将记录保存在数据库中,最好使用 build 而不是create,因为这是一个更便宜的操作并且您将获得相同的结果,除非由于某种原因您的记录必须保存到数据库中,以便您的测试以您想要的方式工作, 例如在您的示例中保存第一条记录。

相关内容

  • 没有找到相关文章

最新更新