Ich beginne ein neues Projekt mit NHibernate, ASP.NET MVC 2.0 und StructureMap und mit NUnit und Moq zum Testen. Für jeden meiner Controller habe ich einen öffentlichen Konstruktor, in den eine ISession injiziert wird. Die Anwendung selbst funktioniert gut, aber in Bezug auf Komponententests muss ich eine ISession imitieren, um die Controller zu testen.Mocking ein NHibernate ISession mit Moq
Wenn ich versuche, die ISession mit MOQ zu verspotten bekomme ich folgende Fehlermeldung:
Nur Eigenschaft Zugriffe unterstützt werden in Zwischen Anrufungen
Es scheint, dass mein Problem erwartet Liste Benutzer aus dem Framework CreateQuery-Methode, aber nach dem googlen des Problems bin ich jetzt klarer.
Ich habe zwei Fragen:
1) Ist dies der falsche Weg Abhängigkeit Injektion eines ISession
2) Gibt es eine Möglichkeit zu verspotten, den Code zu ändern, damit es erfolgreich meine Liste zurückkehren kann
[Test]
public void DummyTest()
{
var mock = new Mock<ISession>();
var loc = new Mock<User>();
loc.SetupGet(x => x.ID).Returns(2);
loc.SetupGet(x => x.FirstName).Returns("John");
loc.SetupGet(x => x.LastName).Returns("Peterson");
var lst = new List<User> {loc.Object};
mock.Setup(framework => framework.CreateQuery("from User").List<User>()).Returns(lst);
var controller = new UsersController(mock.Object);
var result = controller.Index() as ViewResult;
Assert.IsNotNull(result.ViewData);
}
Bitte beachten sie, ich ziemlich sicher bin, konnte ich nur eine hartcodierte Liste der Benutzer erstellen (und nicht einen einzelnen Benutzer spöttisch und es zu einer Liste hinzugefügt hat), aber ich dachte, den Code verlassen würde, wie ich es habe jetzt sofort.
Außerdem führt die Indexaktion dieses bestimmten Controllers im Wesentlichen den CreateQuery-Aufruf aus, der oben imitiert wurde, um alle Benutzer in der Datenbank zurückzugeben. Dies ist ein künstliches Beispiel - lesen Sie nichts in die Details.
Vielen Dank im Voraus für Ihre Hilfe
Edit: Als Antwort auf den folgenden Kommentar, Ich füge den Stacktrace für den Fehler. Außerdem sind alle Eigenschaften der Benutzerklasse virtuell.
Testcase 'Beta.Tests.Unit.Controllers.UserControllerTest.Details_InValidIndex_ReturnsNotFoundView' fehlgeschlagen: System.NotSupportedException: Nur Eigenschaft Zugriffe in Zwischen Anrufungen auf einem Setup unterstützt werden. Nicht unterstützter Ausdruck framework.CreateQuery ("from User"). bei Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall (Method m) bei Moq.ExpressionVisitor.Visit (Expression exp) bei Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall (Method m) bei Moq.ExpressionVisitor.Visit (Expression exp) bei Moq.Mock.AutoMockPropertiesVisitor.SetupMocks (Expression expression) bei Moq.Mock.GetInterceptor (Lambda lambda, Mock mock) bei Moq.Mock. <> c__DisplayClass12 Funktion) bei Moq.Mock.Setup [T1, TResult] (modells, Expression
1 expression) at Moq.Mock
1.Setup [TResult] (Expression`1 expression) Controllers \ UserControllerTest.cs (29,0): bei Beta.Tests.Unit.Controllers.UserControllerTest.Details_InValidIndex_ReturnsNotFoundView()
Könnten Sie einen Stacktrace des Fehlers zeigen? Sind die Benutzereigenschaften abstrakt oder virtuell? –