J'ai récemment mis à niveau mon projet Phoenix vers ecto 2.0.2. J'ai un certain code qui utilise maintenant je pense em> 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é: Comment configurer mes tests afin que cette erreur ne se produise pas? p> p> task.supervisor.async_nolink code> 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)
ecto.adapters.sql.sandbox.mode (myApp.repo, {: partagé, auto ()}) code> que je fais. Malheureusement, cela ne fonctionne pas. p>
3 Réponses :
Si quelqu'un d'autre le rencontre, j'ai une réponse à ce sujet directement à partir de l'auteur de langue Jose Valim: P>
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. P>
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). P> blockQuote>
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.
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. P>
au lieu de: p> < Pré> xxx pré>
Je fais: p> puis je définis et Ajouter de cette façon, je ' m Assurez-vous que la tâche fonctionnera synchrone et fini avant le processus de test. p> p> testtasksupervisor code> p>
config: app,: Task_Supervisor, testtasksupervisor code> dans
config / test.exs code>. p>
Ce problème est finalement résolu par Elixir v1.8.0 et 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. P> db_connection code> v2.0.4. Voir https://Twitter.com/plataformatec/status/1091300824251285504 et
Utilisation d'Elixir 1.10.3 et DB_Connection 2.2.2. Toujours face à cette question.