1

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

模型验证码:

  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 更喜欢(弃用?)代码而不是数据库中的这些测试,但我今晚找不到那个源。(?)无论哪种方式,我都希望看到模型正常工作。

4

2 回答 2

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 }
于 2013-08-02T05:29:58.780 回答
1

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

于 2013-08-02T04:12:23.717 回答