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

时间:2012-03-12 10:26:19

标签: ruby-on-rails testing scope shoulda unique

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

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

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

  

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

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

enter image description here

此外,最后它说它正在尝试使用不同的租户,如果它是真的,它不会产生任何错误(它不会在我运行应用程序本身时),但是,为什么它期待错误?如果它是相同的tenant_id,它应该只会出现错误。

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

2 个答案:

答案 0 :(得分:15)

刚遇到同样的问题。我们能够通过更改

解决它
should validate_uniqueness_of(:email).scoped_to(:tenant_id)

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

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

答案 1 :(得分:0)

我发现scoped_to在某些测试中存在模糊的问题。无论何时遇到,都需要编写更详细的测试并手动测试在同一范围内创建对象的失败。