【问题标题】:Rails 4 Model column uniqueness not workingRails 4模型列唯一性不起作用
【发布时间】:2013-08-02 03:58:14
【问题描述】:

这应该很简单,但我不知道为什么它不起作用。我在这里看到了许多更复杂的唯一性构造。我有应该是唯一索引的列。我在模型中指定了两次,只是测试选项,但我的唯一性测试仍然失败。

模型验证码:

  validates :feed_url,    presence:true,
            format:     {with: VALID_URL_REGEX},
            uniqueness: true
  validates_uniqueness_of :feed_url

RSpec 代码:

  before do
    @feed = FactoryGirl.create(:feed)
  end
...

  describe "when URL is already taken" do
    before do
      feed_with_same_url = @feed.dup
      feed_with_same_url.feed_url = @feed.feed_url
      feed_with_same_url.save
    end
    it { should_not be_valid }
  end

保存应该无效,但测试失败,因为模型说它是有效的,即使字段相等。我自己在断点检查了字段,它们在大小写、长度、值等方面完全相同。

存在性和正则表达式有效性测试完美运行,因此模型正常工作。

我试图在模型中而不是在索引中执行此操作。我相信我昨晚读到 Rails 4 更喜欢(弃用?)代码而不是数据库中的这些测试,但我今晚找不到那个源。 (?) 无论哪种方式,我都希望看到模型正常工作。

【问题讨论】:

  • 只是一个简短的说明,这可能对您解决这个特定问题没有帮助,但可以帮助您进行测试,看看 shoulda-matchers:github.com/thoughtbot/shoulda-matchers
  • 看起来很有趣,谢谢你。正如你通过这个线程看到的那样,我现在对测试方法有点超载。但是,我会把这个放在我的包里以备后用。

标签: ruby-on-rails ruby model rspec ruby-on-rails-4


【解决方案1】:

你必须在某个对象上调用should_not be_valid。试试这个

before(:each) do
  @feed_with_same_url = @feed.dup
  @feed_with_same_url.feed_url = @feed.feed_url
end
it { @feed_with_same_url.should_not be_valid }

【讨论】:

  • 这很有道理,所以我试了一下。我在 Nil 上收到 NoMethodError。如果您跟踪流程,它实际上是在 before 块之前执行的,信不信由你。所以,@feed_with_same_url 当时为零。 describe 贯穿它,然后为它收集的每个它执行之前的它......至少这是我所看到的流程。
  • 尝试在方法调用之前传递:each 选项。我已经更新了我的答案
  • 好的,成功了。让我大吃一惊,但它有效。我展示了创建/保存方法,因为我相信这些驱动了模型。你拿出了存档,它起作用了。我真的不明白。你能详细说明一下吗?非常感谢。
  • 请注意,无论之前是否指定了 :each,我都会得到相同的结果。 before do 和 before(:each) do 给出相同的结果...
  • OK,第一点是使用实例变量。如果您在 before 块中分配局部变量,它将在您的测试中不可用。其次要检查一个对象是否有效,你不需要保存它,但这无关紧要。
【解决方案2】:

在该测试的上下文中,it 是什么?如果没有完整的代码,它可能不是feed_with_same_url,因此您的测试并没有检查您认为它正在检查的内容。

如果我正在编写这个测试,它会是这样的:

let(:feed) { FactoryGirl.create :feed }
let(:feed_with_same_url) { feed.dup }

subject { feed_with_same_url }

it { should_not be_valid }

现在it是主题,也就是feed_with_same_url

【讨论】:

  • 我应该提到验证在模型中,其余代码是 feed_spec.rb 中的 Capybara 构造。我相信这是标准编码。我将对其进行研究,以发现我是否可以分辨出它正在选择的自我。
  • 你根本没有使用 Capybara,这是一个模型规范。
  • 我的意思是原始问题的格式不正确。已更新问题以澄清此问题。
  • 你还没有使用 Capybara。您能否澄清一下您不理解我的答案的哪一部分,因为您的 cmets 根本没有解决我的答案。
  • 你是对的。当我从一个切换到另一个时,我会同时使用这两种术语。可用的许多不同的测试方法让我有点抓狂。
猜你喜欢
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 2017-12-25
  • 2016-03-29
相关资源
最近更新 更多