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

7

我有一个用户类,其中电子邮件是唯一的,但仅适用于租户:

class User < ActiveRecord::Base
  validates :email, :uniqueness => {:scope => :tenant_id, :allow_blank => true}
  #...
end

我正在尝试测试:

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

但测试失败并显示以下信息:
期望错误包含“has already been taken”,当电子邮件设置为“joseph.allen_1@example.com”时,出现错误:["email has already been taken (\"joseph.allen_1@example.com\")", "first_name can't be blank (nil)", "last_name can't be blank (nil)"](tenant_id的值不同)
这引起了很多问题。为什么错误消息不匹配?看起来是因为实际的电子邮件地址包含在错误消息中,但为什么要包含它?当我从UI生成错误时,似乎没有包含它:
此外,最后它说正在尝试使用不同的租户进行测试,如果是真的,那么就不应该生成任何错误(当我运行应用程序本身时就不会),但是,为什么它期望出现错误?只有在tenant_id相同时才应该期望出现错误。
这太令人困惑了。你们有什么想法或如何正确测试这个?
2个回答

15

我也遇到了同样的问题。我们通过更改解决了这个问题。

should validate_uniqueness_of(:email).scoped_to(:tenant_id)

should validate_uniqueness_of(:email_id).scoped_to(:tenant_id)

不确定是否完全相同的情况,但显然我们的问题是由于嵌套资源使匹配器出现了某种问题。


0
我发现scoped_to在某些测试中存在很模糊的问题。每当遇到这种情况时,就需要编写更详细的测试,并手动测试在相同范围内创建对象的失败情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接