使用shoulda(但不是rspec)测试Rails项目中作用域的唯一性

pup*_*eno 7 testing scope ruby-on-rails unique shoulda

我有一个用户类,其中包含一个唯一但限定为租户的电子邮件:

class User < ActiveRecord::Base
  validates :email, :uniqueness => {:scope => :tenant_id, :allow_blank => true}
  #...
end
Run Code Online (Sandbox Code Playgroud)

我正试图用以下方法测试它:

class UserTest < ActiveSupport::TestCase
  context "a user" do
    setup { @user = create :user }
    subject { @user }

    should validate_uniqueness_of(:email).scoped_to(:tenant_id)
  end
end
Run Code Online (Sandbox Code Playgroud)

但测试失败并显示以下消息:

当电子邮件设置为"joseph.allen_1@example.com"时,预期错误包括"已经采取",出现错误:["已经收到电子邮件(\"joseph.allen_1@example.com \")", "first_name不能为空(nil)","last_name不能为空(nil)"](具有不同的tenant_id值)

这提出了很多问题.为什么错误消息不匹配?似乎因为实际的电子邮件地址包含在错误消息中,但为什么包含它?当我从UI生成错误时,它似乎不包括在内:

在此输入图像描述

此外,最后它说它正在尝试与不同的租户,如果它是真的,它不应该生成任何错误(它不是当我运行应用程序本身),但是,为什么它期待错误?如果它是相同的tenant_id,它应该只期望错误.

这太令人困惑了.有什么想法和/或如何正确测试这个?

Aus*_*ang 15

刚遇到同样的问题.我们能够通过改变解决它

should validate_uniqueness_of(:email).scoped_to(:tenant_id)
Run Code Online (Sandbox Code Playgroud)

should validate_uniqueness_of(:email_id).scoped_to(:tenant_id)
Run Code Online (Sandbox Code Playgroud)

不知道它是否完全相同的情况,但显然我们的问题是由嵌套资源以某种方式抛出匹配器的循环引起的.