Тест RSpec не пройдет.Проверка на уникальность с доменным именем - PullRequest
2 голосов
/ 28 марта 2012

Я использую ruby ​​1.9.2 и rails 3.2.2.

У меня есть модель «домен» (domain.rb):

class Domain < ActiveRecord::Base
  attr_accessible :url
  belongs_to :user

  VALID_DOMAIN_REGEX = /^[a-z0-9\-\.]+\.[a-z]{2,}$/i
  validates :url, presence:true,
              format: { with: VALID_DOMAIN_REGEX },
              uniqueness: { case_sensitive: false }

end

И тест, утверждающий, что дубликат домена не должен быть действительным:

require 'spec_helper'

describe Domain do

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

  subject { @domain }

  describe "when domain url is already taken" do
    before do
      domain_with_same_url = @domain.dup
      domain_with_same_url.url = @domain.url.upcase
      domain_with_same_url.save
    end
    it { should_not be_valid }
  end
end

Проверка не проходит:

1) Домен, когда URL домена уже занят Ошибка / Ошибка: это {must_not be_valid} ожидаемый действительный? вернуть ложь, получил истину # ./spec/models/domain_spec.rb:31:in `блок (3 уровня) в '

Ответы [ 4 ]

3 голосов
/ 28 марта 2012

@ домен уже создан, проверен и сохранен.

domain_with_same_url - новая запись, и она должна быть недействительной. Но вы не проверяете это.

Попробуйте

domain_with_same_url = FactoryGirl.create(:domain, :url => @domain.url.upcase)
domain_with_same_url.should_not be_valid
0 голосов
/ 02 августа 2013

У меня была такая же проблема в Уникальность столбца модели Rails 4 не работает . Он предоставляет два других решения без повторного вызова FactoryGirl, только FYI. Я использую:

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 }

Сохранение вызывает некоторую неожиданную для меня проблему. И вам нужно ссылаться на объект should_not_be_valid как локальную переменную.

0 голосов
/ 28 марта 2012

Похоже, что ваш subject вашего теста равен @domain, который является допустимым объектом.Используете ли вы новую тему для @domain_with_same_url (не забудьте сделать ее переменной экземпляра), или явно скажите domain_with_same_url.should ... (точно так же, как указано в ответе "Кто").

0 голосов
/ 28 марта 2012

Ваши два before блока выполняются в порядке от внешнего к внутреннему. Таким образом, при запуске вашего тестового набора сначала создается и сохраняется ваш объект @domain, а затем выполняется внутренний блок before. Однако ваш domain_with_same_url, вероятно, никогда не будет фактически сохранен, потому что проверка не пройдена, что, вероятно, приводит к domain_with_same_url.save для возврата false.

В качестве обходного пути вы можете проверить правильность domain_with_same_url вместо @domain.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...