Mock-Server in einem Controller

8

Ich habe die folgende Zeile in meinem Controller:

%Vor%

Problem ist Server ist nicht virtuell und kann nur mit einem Getter zugegriffen werden.

Ich bekomme ein

  

"Die Methode oder Operation ist nicht implementiert."

Wie kann ich diesen Server verspotten?

Der Test, den ich erstellt habe, ist wie folgt:

%Vor%     
willwin.w 26.06.2013, 23:39
quelle

2 Antworten

8

Angenommen, Sie irgendeine Art von IOC / DI-Container verwenden, sollten Sie nicht auf Controller.Server ab. Stattdessen sollten Sie HttpServerUtilityBase verwenden.

In diesem Beispiel wird davon ausgegangen, Ninject als IOC-Container, aber keines der beliebten Container tun:

Registrieren Sie zuerst HttpServerUtilityBase mit Ihrem IOC-Container wie folgt:

%Vor%

Dies wird sicherstellen, dass Ihre Anwendung zur Laufzeit wird die aktuelle Anforderung des Server Eigenschaft verwenden.

Dann einen Konstruktor zu Ihrem Controller hinzufügen, die eine Instanz% akzeptiert co_de%:

%Vor%

Jetzt, wo immer du HttpServerUtilityBase aufgerufen hast, rufe stattdessen einfach Server.MapPath auf.

Schließlich können Sie in Ihren Tests HttpServerUtilityBase wie folgt vortäuschen (unter der Annahme, dass Moq das Mock Framework ist):

%Vor%

BEARBEITEN

Da Sie erwähnt haben, dass Sie kein DI-Framework verwenden, können Sie auf "Injection des armen Mannes" zurückgreifen. Im Wesentlichen einen überladenen Konstruktor hinzufügen:

%Vor%

Dadurch kann der Produktionscode die aktuelle Webanfrage verwenden, aber Sie können dann Ihre eigene Implementierung von _server.MapPath für den Test erstellen.

    
rossipedia 27.06.2013, 00:30
quelle
13

Sie können ein Mocking-Framework in Ihrem Unit-Test-Code verwenden, z. B. Rhino.Mocks, Moq oder FakeItEasy

Ein Beispiel für einen Einheitentestkörper wäre (in diesem Beispiel Moq)

%Vor%

Dann können Sie das Ergebnis bestätigen.

Hoffe das gibt dir ein paar Ideen

    
heads5150 27.06.2013 00:28
quelle

Tags und Links