2016-12-23 3 views
1

У меня возникла следующая проблема.Рельсы 5 - Ошибки с FactoryGirl

Я использую Rails Factory Girl с такими переменными, как это:

FactoryGirl.define do 
    conta_destino_matriz = FactoryGirl.create(:conta_pessoa_fisica, saldo: 0) 
    conta_origem_filial = FactoryGirl.create(:conta_pessoa_fisica, saldo: 1000, ancestry: conta_destino_matriz.id) 

    codigo_transacional = TransacaoHelper::Gerador.codigo_alphanumerico(
    tipo: 'transferencia', conta_origem_id: conta_origem_filial.id, conta_destino_id: conta_destino_matriz.id 
) 

    factory :transacao_transferencia_matriz, class: Transacao do 
    tipo { 'transferencia' } 
    valor { '250' } 
    conta_origem_id { conta_origem_filial.id } 
    conta_destino_id { conta_destino_matriz.id } 

    trait :campos_completos do 
     codigo_transacional { codigo_transacional } 
     conta_origem_valor_antes_transacao { conta_origem_filial.saldo } 
     conta_destino_valor_antes_transacao { conta_destino_matriz.saldo } 
     estornado { false } 
     codigo_transacional_estornado { nil } 
    end 
    end 
end 

Где conta_destino_matriz объявлена ​​вне определения имени завода. Это необходимо потому, что два атрибута из де фабрики должны иметь два значения из некоторого объединения, как:

conta_destino_id     { conta_destino_matriz.id } 
conta_destino_valor_antes_transacao { conta_destino_matriz.saldo } 

И еще один тест использует завод с одной и той же ассоциации фабрики conta_pessoa_fisica:

FactoryGirl.define do 
    conta_origem_hierarquia_igual = FactoryGirl.create(:conta_pessoa_fisica, saldo: 1000) 
    conta_destino_hierarquia_igual = FactoryGirl.create(:conta_pessoa_fisica, saldo: 0, ancestry: conta_origem_hierarquia_igual.id) 
    codigo_transacional_hierarquia_igual = TransacaoHelper::Gerador.codigo_alphanumerico(
     tipo: 'transferencia', conta_origem_id: conta_origem_hierarquia_igual.id, conta_destino_id: conta_destino_hierarquia_igual.id 
) 

    conta_origem_hierarquia_diferente = FactoryGirl.create(:conta_pessoa_fisica, saldo: 1000) 
    conta_destino_hierarquia_diferente = FactoryGirl.create(:conta_pessoa_fisica, saldo: 0) 

    factory :transacao_transferencia_hierarquia, class: Transacao do 
    tipo { 'transferencia' } 
    valor { '250' } 
    conta_origem_id { conta_origem_hierarquia_igual.id } 
    conta_destino_id { conta_destino_hierarquia_igual.id } 

    trait :campos_completos do 
     codigo_transacional { codigo_transacional_hierarquia_igual } 
     conta_origem_valor_antes_transacao { conta_origem_hierarquia_igual.saldo } 
     conta_destino_valor_antes_transacao { conta_destino_hierarquia_igual.saldo } 
     estornado { false } 
     codigo_transacional_estornado { nil } 
    end 

    trait :diferente do 
     conta_origem_id { conta_origem_hierarquia_diferente.id } 
     conta_destino_id { conta_destino_hierarquia_diferente.id } 
    end 
    end 
end 

И это ассоциации:

FactoryGirl.define do 
    factory :pessoa_fisica do 
    cpf { Faker::Number.number(11) } 
    nome { Faker::Name.name } 
    data_nascimento { Date.today.strftime('%Y-%m-%d') } 

    factory :pessoa_fisica_invalida do 
     id { 0 } 
     cpf { Faker::Number.number(10) } 
     nome { '' } 
     data_nascimento { (DateTime.now + 1.day).strftime('%Y-%m-%d') } 
    end 
    end 
end 

ошибка, что я получил происходит в «Номе» атрибута из: pessoa_fisica класс уже хранится. Полевые муссы уникальны и только персонажи.

nome { Faker::Name.name } 

Так что, когда мой тестовый прогон и Он призывает: transacao_transferencia_matriz и: transacao_transferencia_hierarquia и иногда я получил сообщение об ошибке, что говорит

`raise_validation_error': A validation failed: Nome is already taken (ActiveRecord::RecordInvalid) 

И тем хуже, это то, что я получил эту ошибку не всегда, но иногда.

ответ

1

Следующая в вашем заводе не гарантирует уникальность:

nome { Faker::Name.name } 

Факер генерирует имя из ограниченного набора и иногда возвращает имя, которое уже существует в базе данных. Поскольку у вас есть проверка валидации для модели, она, конечно, терпит неудачу.

Чтобы гарантировать уникальность последовательности использования в названии, в пределах вашего завода:

sequence(:nome) {|n| "#{Faker::Name.name} #{n}" } 

Вы должны в идеале быть гарантируя, что ваша база данных находится в чистом состоянии для каждого теста - проверить database cleaner камень

+1

Я пришел, чтобы закончить эту тему. Реальная проблема заключалась в том, что я ожидал, что FactoryGirl очистит базу данных, но это не так. Итак, ошибка была в этом. То, что у Faker есть ограничение имен, которые иногда совпадают с базой данных, и я получил ошибку. Спасибо за подсказку. Я тоже буду использовать последовательность, но в этом случае буду использовать буквы, потому что поле не может иметь числа. –

Смежные вопросы