Fabricantes gerando nomes duplicados devido ao banco de dados de teste local antigo

Tive uma série de testes falhando com erros como este:

ActiveRecord::RecordInvalid:
       Validation failed: Name has already been taken

e parece que este é o problema:

  fab!(:the_group) { Fabricate(:group) }

Todos esses funcionaram até recentemente. Vi isso em outro plugin em que estava trabalhando e, acho, consegui definir um nome aleatório para mim, mas estes funcionaram, acredito, até ontem.

Algo mudou, ou fiz algo bobo por engano?

EDIT: Com a ajuda de Claude e do Discourse Helper Bot, tentei substituir o fab acima por

  Fabricator(:the_group) do
    name { sequence(:group_name) { |i| "Test Group #{i}" } }
  end

mas não consegui descobrir como fazer isso.

Então usei

  let(:the_group) { Fabricate(:group) }

em vez do !fab acima e isso reduziu o número de falhas de 12 para 1, mas ainda está falhando com

  1) Pfaffmanager::ServersController servers admin can get servers owned by a group
     Failure/Error: let(:the_group) { Fabricate(:group) }

     ActiveRecord::RecordInvalid:
       Validation failed: Name has already been taken

Não acho que nada em torno desses testes tenha mudado desde ontem às 10h30 CDT, quando fiz o último commit.

Reverti para um commit anterior e agora falha com


  1) Pfaffmanager::ServersController servers includes groups that the user is in
     Failure/Error: let(:the_group) { Fabricate(:group) }

     ActiveRecord::RecordInvalid:
       Validation failed: Name has already been taken

e executei novamente sem fazer nenhuma alteração e agora falha em


  1) Pfaffmanager::ServersController servers can update group id if group owner
     Failure/Error: let(:the_group) { Fabricate(:group) }

     ActiveRecord::RecordInvalid:
       Validation failed: Name has already been taken

Então parece que está falhando em um teste, e é aleatório?

1 curtida

Talvez seu banco de dados de teste local tenha entrado em um estado ruim? Eu tentaria executar:

RAILS_ENV=test bin/rake db:drop db:create db:migrate
3 curtidas

OMG. Então, eram, de fato, gremlins.

Estranhamente, o primeiro db:create não criou o banco de dados multisite, mas quando executei apenas a tarefa db:create por si só, ele criou. E então a migração foi bem-sucedida, e então funcionou.

E @Lilly, você e seus :eyes: me fazem rir.

Entendi, então algo como eu ter aquele banco de dados de teste há muito tempo e os nomes gerados aleatoriamente começaram a colidir com os anteriores. Isso agora faz sentido. Mudei meu script de atualização (que faz um git pull, atualiza o código de all-the-plugins, verifica a versão do ruby e assim por diante) para remover, criar e migrar o banco de dados de teste.

4 curtidas

hah. bem, eu estava de olho nos seus trechos de código porque tinha certeza de que deveria ter funcionado porque:

2 curtidas

Em teoria, o banco de dados de teste deve ser limpo automaticamente após cada execução de teste. Portanto, ele nunca deve chegar a esse estado. Mas… se os processos de teste forem encerrados de forma inadequada de alguma forma, acho que é possível que essa limpeza (tecnicamente, a restauração de um savepoint do pg) seja ignorada.

Portanto, isso não deve ser uma ocorrência normal. Pessoalmente, eu só me preocuparia com o drop/create/migrate se começasse a ter falhas estranhas.

Mas, se você não se importa com a espera, não há problema em recriar seu banco de dados de teste regularmente :+1:

3 curtidas

Faz sentido. Eu adoro ^c.

Eu odeio esperar. Vou comentar e torcer para me lembrar. :slight_smile:

Obrigado novamente por descobrir isso. Eu tinha certeza de que estava ficando louco.

2 curtidas

Este tópico foi fechado automaticamente 30 dias após a última resposta. Novas respostas não são mais permitidas.