2010-12-19 5 views
0

Ich versuche, meine Controller zu testen, aber jeder von ihnen ist abhängig von einem Dienst, der von einem Repository abhängig ist. Ich habe den folgenden Code ...AutoMocker Frage

Mock.Get(controller.Get<ServiceInterface>()) 
      .Setup(s => s.GetData()) 
      .Returns(FakeData.Create<Entity>(25)); 

Ich halte einen Fehler immer auf die ServiceInterface konkrete Klasse im Zusammenhang keine Standardinstanz für sein Repository mit (eingespritzt). Ich versuche zu vermeiden, einen FakeService zu erstellen, aber es sieht so aus, als würde ich das tun müssen. Kann mir jemand Vorschläge machen?

Antwort

0

Welche Klassen versuchen Sie zu testen und welche Klassen versuchen Sie auszugeben? Ich würde vermuten, dass Sie versuchen, Ihren Controller zu testen, und möchten Ihren Dienst ausstellen. Wenn dies der Fall ist, sollte die konkrete Implementierung Ihres Dienstes und damit seine Abhängigkeiten überhaupt nicht an Ihrem Test teilnehmen und irrelevant sein. Sie sollten nur das Verhalten der Service-Schnittstelle, die zum Testen Ihres Controllers benötigt wird, ausmerzen.

Ich rate nur auf Ihre Absicht, also, wenn meine Antwort keinen Sinn ergibt, müssen Sie möglicherweise mehr Code, der zeigt, was Sie versuchen zu testen.

+0

Mein Controller hat eine injiziert Abhängigkeit von meinem Dienst und mein Service hat eine injiziert Abhängigkeit auf einem Repository. Ich versuche, meinen Dienst zu verspotten, damit ich ihn einschleusen kann, aber das Problem, auf das ich stoße, ist, wenn ich versuche, meinen Dienst zu verspotten. Ich erhalte einen Fehler, wenn AutoMocker nicht in der Lage ist, ein Mock-Repository in den verspotteten Dienst zu injizieren. Hoffe das erklärt ein bisschen mehr. – jsteve81

+0

Das ergibt wirklich keinen Sinn. Wenn Ihr Controller von der Service-Schnittstelle abhängig ist und der Controller nicht direkt von der Repository-Schnittstelle abhängig ist, sollte NOTHING beim Mocking der Service-Schnittstelle vom Repository abhängen. In diesem Fall sollte es in Ihrem Test nicht angezeigt werden. Verwenden Sie die Repository-Schnittstelle in Ihrer Testkonfiguration? Wird die Klasse von FakeData verwendet? –

1

My response to this question zeigt, wie Sie Ihre Dienste zur Erfüllung einer Schnittstelle programmieren können, diese Schnittstelle als Abhängigkeit verwenden und dann den Dienst vortäuschen, um Sie beim Komponententest zu unterstützen.

bearbeiten

keine Erfahrung mit dem MoqAutoMocker gehabt zu haben, ist mein Rat etwas eingeschränkt. Aber ich würde damit beginnen, Moq direkt zu benutzen und zu sehen, ob das irgendwelche Probleme verursacht.

var serviceMock = new Mock<IService>(); 
serviceMock.Setup(r => r.GetData()) 
    .Returns(FakeData.Create<Entity>(25)); 
var controller = new MyController(serviceMock.Object); 

Sobald Sie sichergestellt haben, dass dies funktioniert, können Sie den Auto-spöttischen Aspekt davon vorstellen:

var autoMocker = new MoqAutoMocker<MyController>(); 
Mock.Get(autoMocker.Get<IService>()).Setup(r => r.GetData()) 
    .Returns(FakeData.Create<Entity>(25)); 
MyController controller = autoMocker.ClassUnderTest; 
+0

Danke Stripling ... mein Service implementiert bereits eine Schnittstelle. Weitere Informationen finden Sie im Kommentar zur zweiten Antwort. – jsteve81

+0

@jsteve: Ist Ihr Controller von der Service-Schnittstelle oder der konkreten Klasse abhängig? Es scheint mir unwahrscheinlich, dass AutoMock die Abhängigkeiten der konkreten Klasse kennen würde, wenn Ihr Konstruktor angibt, dass es die Schnittstelle verwendet. – StriplingWarrior

+0

Die Service-Schnittstelle – jsteve81