2017-11-30 2 views
0

Ich teste eine Phönix/Elixier-Anwendung, und ich finde mich mit etwas wie die folgenden eine ganze Menge.Assert Muster übereinstimmen in Phoenix Tests

player = insert(:player) 
assert [%Player{id: x}] = Players.site_players(player.site_id) 
assert x == player.id 

Dies erfüllt die Dinge, die ich will, vor allem sichergestellt, dass Players.site_players/1 gibt einen Array zurück und das Array mit dem Player. Ich habe das Gefühl, dass dies prägnanter gemacht werden könnte. Irgendwelche Vorschläge?

+1

Der beste Weg des Trocknens wäre es all diese Tests zu entfernen. Sie testen "DB" -Funktionalität und "Ecto" -Funktionalität. Das macht keinen Sinn. Tests in _ihr_ Anwendung sollten Ihre Anwendung testen, nicht "Ecto", das eigene Tests hat. – mudasobwa

+0

Ich teste, dass mein Code (in diesem Fall die Methode site_players) Ecto bittet, die entsprechenden Dinge zu tun. Dies ist der einfachste Ort, an dem ich auf das Muster stoße, das ich aus Gründen der Veranschaulichung auswählen möchte. An anderen Stellen läuft es gegen komplizierteren Code. – biagidp

+0

Überhaupt nicht. 'defmodule Spieler, do: def site_players (id), do:% Player {id: id}' Implementierung von 'Player' _ würde diesen Test nicht überraschend bestehen_. Was im Grunde bedeutet, dass Sie die ** Implementierungsdetails ** testen. – mudasobwa

Antwort

1

Ich bin nicht sicher, wie präzise Sie erwartet haben, aber hier ist, wie in einer weniger Code-Zeile die gleiche Sache zu tun:

%Player{id: id, site_id: site_id} = insert(:player) 
assert [%Player{id: ^id}] = Players.site_players(site_id) 

Wie Sie vielleicht schon wissen, können Sie nicht einen Funktionsaufruf haben zusammen Mit dem Pin-Operator, nur ein lokaler Variablenname, weshalb wir die ID in eine Variable in der ersten Zeile extrahieren.

Die erste Zeile kann auch die folgenden, wenn Sie wollen:

%{id: id, site_id: site_id} = insert(:player) 
Verwandte Themen