Rspec фабричный бот Postgres UUID выпуск - PullRequest
0 голосов
/ 07 февраля 2019

Я создаю объект пользователя с использованием фабричного бота в спецификации функции rspec.

Пользователь принадлежит компании и имеет следующие заводские настройки

FactoryBot.define do
  factory :user do
    company
    auth_token { Faker::Internet.password }
    email { Faker::Internet.email }
    first_name { Faker::Name.first_name }
    last_name { Faker::Name.last_name }
    contact_phone { '+353871234567' }
    status { true }
    password { Faker::Internet.password }
    password_confirmation { password }
  end
end

Когда я создаю пользователячерез консоль rails фабрика работает как положено

user = FactoryBot.create(:user)

Компания создана, и я могу видеть company_id как UUID для объекта

#<User id: "bb9fd4c7-bdce-4338-a42d-723876f514bc", company_id: "41e35b15-d766-4b1a-b833-bf1df4241064", first_name: "Frank", last_name: "Grimes", email: "drewshields@gislason.co"...

Но когда я использую ту же фабрику внутриСпецификация функции rspec Поля id и company_id сохраняются как целые числа, а не как UUID

#<User id: 288, company_id: 0, first_name: "Bob", last_name: "Deckow", email: "raleighharber@leannon.info"...

Создание пользователя в rspec находится ниже

let(:user) { create(:user) }

Есть ли какая-либо причина, по которой rspec может иметь такой эффект?Полная спецификация ниже:

# frozen_string_literal: true

# Specs for password reset
require 'rails_helper'

describe 'password reset', type: :feature do
let(:user) { create(:user) }
let(:invaliduser) {
    invalid = build(:user, first_name: nil, contact_phone: '123')
    invalid.save(validate: false)
    invalid
}

context 'active user resets password' do
    it 'sends an email to the user' do
        visit root_path
        first(:link, 'Login').click
        click_on 'Forgotten Password?'
        fill_in 'Email', with: user.email
        click_on 'Reset Password'

        expect(page).to have_content('If a matching email was found an email has been sent with password reset instructions.')
        expect(ActionMailer::Base.deliveries.last.to).to include(user.email)
        expect(ActionMailer::Base.deliveries.last.subject).to include('Please reset your password')
    end
end

context 'inactive user resets password' do
    it 'sends an email to the {{__}} team' do
        visit root_path
        first(:link, 'Login').click
        click_on 'Forgotten Password?'
        fill_in 'Email', with: invaliduser.email
        click_on 'Reset Password'

        expect(page).to have_content('If a matching email was found an email has been sent with password reset instructions.')
        expect(ActionMailer::Base.deliveries.last.to).to include('{{team_email}}')
        expect(ActionMailer::Base.deliveries.last.subject).to include('User Account Recovery')
    end
end

end

1 Ответ

0 голосов
/ 07 февраля 2019

Убедитесь, что у вас одинаковая схема для баз данных разработки и тестирования.Самый простой способ просто отбросить и заново создать тестовую базу данных

RAILS_ENV=test rake db:drop
RAILS_ENV=test rake db:setup

Убедитесь, что у вас есть идентификаторы типа UUID в schema.rb

...