Ich bin auf der Suche nach einer Möglichkeit, BeginInvoke für eine Action-Methode zu testen, da die Methode in einem Hintergrundthread ausgeführt wird und es keine Möglichkeit gibt, zu wissen, wann sie die Callback-Methode tatsächlich beendet oder aufruft. Ich suche nach einer Möglichkeit, meinen Test zu warten, bis der Callback aufgerufen wird, bevor Assertions erstellt werden.
In der folgenden Presenter-Klasse können Sie feststellen, dass ich PopulateView im Hintergrundthread aufruft, das die Ansicht aktualisiert, wenn Daten abgerufen werden, und ich versuche, die Ansicht zu aktivieren. Eigenschaften werden korrekt initialisiert.
Ich benutze NUnit und Moq.
%Vor%Entwirf deinen Code, damit du das gewünschte Verhalten zum Testzeitpunkt injizieren kannst.
%Vor%Diese Version ist asynchron. Zur Testzeit können Sie einfach eine blockierende Version erstellen:
%Vor%Dann ändert sich Ihr Code einfach zu diesem:
%Vor%Zur Laufzeit ist es asynchron. Zur Testzeit blockiert es den Anruf.
BeginInvoke()
gibt eine IAsyncResult
zurück, mit der Sie warten können.
Sie müssen nicht überprüfen, dass Methoden aufgerufen werden, sondern das Endergebnis testen - in diesem Fall das _view.Propert1 == "xyz".
Da es sich um einen asynchronen Aufruf handelt, müssen Sie möglicherweise eine Schleife erstellen, die regelmäßig darauf hinweist, dass der Wert festgelegt wurde. Auch ein Timeout beim Test oder der Überprüfung ist ein Muss, andernfalls würde Ihr Test niemals fehlschlagen (einfach hängen). p>
Sie könnten in Erwägung ziehen, die Aktion (PopulateView) auszugeben, um den Ruhezustand zu überspringen.
Tags und Links .net c# unit-testing begininvoke