RSpec ActiveRecord :: RecordInvalid: проверка не пройдена: электронная почта уже получена, несмотря на наличие последовательности в FactoryBot - PullRequest
0 голосов
/ 09 июня 2018

В моем приложении на Rails есть модель, называемая «доступность», которая позволяет поставщикам устанавливать свою доступность (то есть время работы).Таким образом, доступности принадлежат поставщикам и пользователям принадлежат, а пользователям - поставщики has_many и доступность поставщиков - has_many.

Я пытался создать тесты Rspec для своего действия доступности # уничтожить.Конкретный тест, на который я ссылаюсь:

#spec/controllers/availabilities_controller_spec.rb
require 'rails_helper'

RSpec.describe AvailabilitiesController, type: :controller do

  describe "availabilities#destroy action" do

    it "should allow a user who created the availability to destroy it"
      availability = FactoryBot.create(:availability) 
      sign_in availability.user
      delete :destroy, params: { id: availability.id, vendor_id: availability.vendor_id}
      availability = Availability.find_by_id(availability.id)
      expect(availability).to eq nil
   end 
  end
end

Однако, когда я запускаю этот тест, я получаю следующую ошибку:

"Произошла ошибка при загрузке ./spec/controllers/availabilities_controller_spec.Ошибка / Ошибка: user = FactoryBot.create (: user)

ActiveRecord :: RecordInvalid: Ошибка проверки: электронная почта уже получена "

Однако я использую фабричного бота для своих фабрики у меня есть пользовательская фабрика для запуска в виде последовательности (см. ниже):

FactoryBot.define do
  factory :user do
    sequence :email do |n|
      "dummyEmail#{n}@gmail.com"
    end
    password "secretPassword"
    password_confirmation "secretPassword"
    confirmed_at Time.now
  end
end

Как можно уже получить электронное письмо?Чем можно объяснить эту ошибку?

1 Ответ

0 голосов
/ 09 июня 2018

Я рекомендую вам использовать Faker вместе с FactoryBot.Это даст вам больше гибкости и избавит от необходимости делать этот sequence трюк.Faker с легкостью создает поддельные данные.

В любом случае используйте database_cleaner для очистки базы данных среды тестирования после каждого теста.Вам нужно только установить, что это вверх:

# ./spec/rails_helper.rb

# start by truncating all the tables but then use the faster transaction strategy the rest of the time.
config.before(:suite) do
  DatabaseCleaner.clean_with(:truncation)
  DatabaseCleaner.strategy = :transaction
end

# start the transaction strategy as examples are run
config.around(:each) do |example|
  DatabaseCleaner.cleaning do
    example.run
  end
end
...