Ich muss meinen Autofac-Container mit einer bestimmten Schnittstelle registrieren, für diesen Fall möchte ich den Schein auflösen.
Wie kann ich es tun?
Ich habe es versucht:
%Vor% Ich möchte meinen Code nicht ändern, um etwas anderes als IStudyLoader
zu lösen, aber Mock<IStudyLoader>
ist nicht substituierbar für IStudyLoader
; Beispiel: Mock<IStudyLoader>.Object
ist für IStudyLoader
ersetzbar, aber ich kann Mock<IStudyLoader>.Object
nicht registrieren, weil es kein Typ ist.
Korrigiere mich bitte; Ich habe das Gefühl, dass mir etwas fehlt.
(Ich habe eine andere Einschränkung, ich kann keinen anderen Container als ApplicationContainer.GetApplicationContainer()
verwenden)
(Ich denke, es ist besser, die Abhängigkeit beim Testen manuell zu injizieren, aber ich möchte den Produktionscode dieses Mal nicht ändern.)
Die Methode, nach der Sie suchen, heißt RegisterInstance
:
Ein vorhandener Container (in Ihrem Fall der AppContainer), der bereits eine Registrierung für die Schnittstelle enthält, die Sie verspotten möchten, kann die Instanz nicht auflösen . Es wird weiterhin die Produktionsinstanz auflösen.
Ein "Workaround", den ich Ihnen unbedingt empfehlen sollte, ist, den AppContainer nicht in Ihren Test einzubeziehen, sondern einen Container zu erstellen, der auf Ihren Test zugeschnitten ist, damit Sie besser steuern können, was dort hinein geht. Der Effekt ist, dass Sie jede Mock-Instanz, die Sie benötigen, zusammen mit dem SUT registrieren.
Ich habe keine besonderen Erfahrungen mit Autofac, aber die meisten anderen Container, mit denen ich gearbeitet habe, erlauben es, eine Instanz eines Objekts zu registrieren, das bereits erstellt wurde. Sie können also Ihren Schein erstellen und dann mock.Object als Implementierung für IStudyLoader registrieren. Konsultieren Sie die Autofac-Dokumentation, um dies zu tun.
Da diese Frage gestellt wurde, gibt es jetzt ein AutoFac.Extras.Moq
-Paket, unterstützt von AutoFac:
Damit können Sie Abhängigkeiten innerhalb Ihrer Komponententests erstellen
Alte Frage, aber AutoFac Jetzt seit Version 4.0.1 unterstützt Moq4 und bietet zusätzliches Paket an, das Sie installieren können Autofac.Extras.Moq
%Vor%Autofac.Extras.Moq automatische Installation von AutoFac und Moq
Sie müssen keinen Container erstellen und StudyLoader registrieren. Es ist implizit von Autofac.Extras.Moq definiert.
Autofac.Extras.Moq ist wertvoll für verschachtelte Abhängigkeit. Es ist nicht wichtig, den gesamten Abhängigkeitsgraphen zu registrieren. Verursachen Sie nur Ihr SystemUnderTest SUT-Objekt
Sie können Ihren Testfall wie folgt implementieren:
%Vor%