Der folgende Code funktioniert wie erwartet und ist den auf der ASP-Site gefundenen Beispielen sehr ähnlich:
%Vor%Mein Test funktioniert gut, es erreicht die Aktion im Controller ganz gut. Im wirklichen Leben sind die Tests jedoch etwas komplizierter. Ich muss einige Dienste und eine benutzerdefinierte Testkonfiguration hinzufügen.
Um dies zu tun, erstelle ich einen TestStartup, der von meinem ursprünglichen Projekt Startup-Klasse erbt:
%Vor%Wie Sie sehen, delegiert es nur an die Basisklasse, also ändere ich jetzt den Builder, um meinen TestStartup-Code zu verwenden:
%Vor%Und die Tests scheitern jetzt mit der Http NotFound-Ausnahme. Beim Debugging stellt sich heraus, dass die Aktion im Controller nicht mehr vom Testcode getroffen wird.
Meine Vermutung ist, dass mvc irgendwie die Routen nicht erkennt, wenn die Startup-Datei eine andere Assembly ist als die Controller, wie kann ich das umgehen?
Ich habe einen Artikel über diese Art von Integrationstests mit xUnit geschrieben: Ссылка .
Der Ansatz, den ich gewählt habe, bestand darin, eine Klasse Fixture
zu erstellen, die in Ihre Testklasse eingefügt werden kann.
Das Fixture:
%Vor% Die Testklasse implementiert dann IClassFixture<TestFixture<TStartup>>
:
Um MVC zu verwenden und sicherzustellen, dass Ihre Ansichten erkannt werden, sollten Sie Ihr WebHostBuilder
aktualisieren, um den Inhaltspfad festzulegen:
Eine weitere zusätzliche Änderung, die ich vornehmen musste, um eine überschriebene Startup-Klasse zum Laufen zu bringen, bestand darin, ApplicationName im IHostingEnvironment-Objekt auf den tatsächlichen Namen des Webprojekts zu setzen.
%Vor%Dies ist erforderlich, wenn sich der TestStartup in einer anderen Assembly befindet und die ursprüngliche Startup-Klasse überschreibt. UseContentRoot wurde in meinem Fall immer noch benötigt.
Wenn der Name nicht gesetzt ist, habe ich immer eine 404 nicht gefunden.
Sie können Ihre Dienste auf diese Weise nicht durch Testdienste überschreiben. Was ich getan habe, war Methoden zu erstellen, die Abhängigkeiten hinzufügten und die Methode übersteuerbar machten. Dann würde ich in meinem Test diese Methode überschreiben und verschiedene Abhängigkeiten einfügen.
Ich erkläre das auch in meinem Blog: Ссылка
Tags und Links c# asp.net asp.net-core asp.net-core-mvc