8
votes

Erreur de bac à sandbox ecto 2.0 SQL sur les tests

J'ai récemment mis à niveau mon projet Phoenix vers ecto 2.0.2. J'ai un certain code qui utilise task.supervisor.async_nolink pour faire des mises à jour de la DB sur son propre thread. Je reçois l'erreur suivante lorsque mes tests sont exécutés (se produit uniquement sur mes tests) xxx

maintenant je pense Je comprends ce qui se passe: le pool de raccords de sandbox ecto est en train d'être vérifié dans avant que la transaction DB soit terminée. Selon les docs (au moins la façon dont je les lis), le moyen de contourner ce produit est d'utiliser un pool de connexion partagé: ecto.adapters.sql.sandbox.mode (myApp.repo, {: partagé, auto ()}) que je fais. Malheureusement, cela ne fonctionne pas.

Comment configurer mes tests afin que cette erreur ne se produise pas?


0 commentaires

3 Réponses :


6
votes

Si quelqu'un d'autre le rencontre, j'ai une réponse à ce sujet directement à partir de l'auteur de langue Jose Valim:

Oui, votre compréhension du problème est correcte. Cela se produit car le processus de test, celui qui possède la connexion, a disparu mais la tâche utilise toujours sa connexion. Utilisation {: partagé, auto ()} ne le répare pas car le test possède toujours la connexion, vous partagez simplement cela implicitement.

Le moyen de résoudre est de garantir la tâche terminée avant la sortie des tests. Cela peut être fait en appelant processus.exit (Task_pid,: tuer). Si vous ne connaissez pas la tâche PID, vous pouvez appeler Task.Supervisor .which_children (Nameofyourtasksupervisor) pour retourner tous les PID que vous traversez et les tuer. Toutefois, si vous faites cette approche, le test ne peut pas fonctionner simultanément (comme vous pouvez tuer des tâches lancées par un autre test).


2 commentaires

TLDR: Il n'y a pas de solution.


Merci de déclarer ce qui a été trouvé. J'ai utilisé les commentaires de Jose pour résoudre le problème bien pour moi. Donc, c'est la solution.



5
votes

J'ai eu le même problème aujourd'hui et je pense avoir trouvé une solution possible avec permet aux tests de fonctionner simultanément.

J'utilise la technique décrite ici: http: //blog.plataformatec.com.br/2015/10/mocks-and-explicite-contracts/ Pour remplacer la tâche.supervisor en exécutant des tests.

au lieu de: < Pré> xxx

Je fais: xxx

puis je définis testtasksupervisor xxx

et Ajouter config: app,: Task_Supervisor, testtasksupervisor dans config / test.exs .

de cette façon, je ' m Assurez-vous que la tâche fonctionnera synchrone et fini avant le processus de test.


0 commentaires

0
votes

Ce problème est finalement résolu par Elixir v1.8.0 et db_connection v2.0.4. Voir https://Twitter.com/plataformatec/status/1091300824251285504 et https://elixirforum.com/t/problème-asynchronizing-calls/19796/8

Si vous utilisez des versions d'Elixir et de DBConnection plus récente que celles mentionnées ci-dessus, le test doit fonctionner hors de la boîte sans aucune erreur.


1 commentaires

Utilisation d'Elixir 1.10.3 et DB_Connection 2.2.2. Toujours face à cette question.