Wie richte ich diese (Moq Setup)
Möchte ich testen, mein Teil des Codes, der gibt die Benutzer-Passwort-Frage. So habe ich mir vorgenommen ein Modell der Membership-provider mit Moq.
Ich glaube nicht, dass ich brauchen, um Ihnen zu zeigen der eigentliche code nur den test Teil.
//Arrange
var membershipMock = new Mock<MembershipProvider>();
membershipMock.Setup(m => m.GetUser("test", false).PasswordQuestion).Returns("Password");
authentication.Authenticate.Provider = membershipMock.Object;
//Act
var actual = authentication.PasswordRecoveryStep1(It.IsAny<string>());
//Assert
Assert.That(actual, Is.EqualTo("Password"));
So, wenn ich dieses in Nunit ich dieses:
Test.Controllers.AuthenticationControllerTest.Test_If_Password_Recovery_Setp1_Returns_Users_PasswordQuestion:
System.NotSupportedException : Only property accesses are supported in intermediate invocations on a setup. Unsupported expression m.GetUser("test", False).
at Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall(MethodCallExpression m)
at Moq.ExpressionVisitor.Visit(Expression exp)
at Moq.Mock.AutoMockPropertiesVisitor.VisitMemberAccess(MemberExpression m)
at Moq.ExpressionVisitor.Visit(Expression exp)
at Moq.Mock.AutoMockPropertiesVisitor.SetupMocks(Expression expression)
at Moq.Mock.GetInterceptor(LambdaExpression lambda, Mock mock)
at Moq.Mock.<>c__DisplayClass15`2.<SetupGet>b__14()
at Moq.PexProtector.Invoke[T](Func`1 function)
at Moq.Mock.SetupGet[T1,TProperty](Mock mock, Expression`1 expression)
at Moq.Mock.<>c__DisplayClass12`2.<Setup>b__11()
at Moq.PexProtector.Invoke[T](Func`1 function)
at Moq.Mock.Setup[T1,TResult](Mock mock, Expression`1 expression)
at Moq.Mock`1.Setup[TResult](Expression`1 expression)
at Test.Controllers.AuthenticationControllerTest.Test_If_Password_Recovery_Setp1_Returns_Users_PasswordQuestion() in D:\MvcApplication9\Test\Controllers\AuthenticationControllerTest.cs:line 186
So, ich vermute, es ist etwas wegen der Eigenschaft, die ich versuche zu zugreifen. Ich bin nicht sicher, wie Sie Sie, um es einzurichten. Ich bin nicht sehr gut mit lambdas (und nicht in der Lage zu finden, ein tutorial auf Sie noch) also ich bin nicht sicher, ob ich konnte einige, wie vereinbaren Sie es anders machen, damit es funktioniert.
Oder ob ich einfach nur völlig verfehlt die Marke.
InformationsquelleAutor chobo2 | 2009-06-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort ist in der exception message:
Versuchen Sie dies:
Ok ich habe es herausgefunden. Ich habe ganz vergessen, als ich dies schrieb, Sachen, die ich habe Sachen wie Mitgliedschaft.GetUser(); So war es nie mit meinem Eigentum, entweder bekommt einer real-Anbieter oder mockup-Anbieter. So funktioniert es jetzt. Ich jedoch verstehe nicht, was der Unterschied zwischen diesen sind auch wenn: die Mitgliedschaft.GetUser(); // was war ich vor der Verwendung. jetzt, da ich übertrage es in der provider-Sache(da ich denke, dass wenn ich nicht ich wäre nicht in der Lage sein, um das mock-Objekt? Wie konnte ich nur die Verwendung der Mitgliedschaft statt der Mitgliedschaft.Anbieter?) Ich scheine zu bekommen, eine andere. sieht genauso aus(genannt getUser) aber nur
hat wie 2. überladen von Methoden. Wo, wie der erste hat, wie 6.
InformationsquelleAutor eu-ge-ne
Ich nehme an, dass die intermediate-Aufruf, die es sich bezieht ist dieses:
m.GetUser("test", false)
da es gefolgt von.PasswordQuestion
. Was er sagt ist: man kann nicht eine Methode verwendet als Zwischenprodukt stub, nur eine Eigenschaft. Dieser Besondere Rahmen scheint die Unterstützung intermediate stubs (d.h. Konstrukte X. Y in der stub-definition, beachten Sie den Punkt), aber die meisten anderen nicht.Stubs sind nicht magisch, alles, was Sie tun können, ist Ihre Anrufe abzufangen und ersetzen Sie das Ergebnis mit Ihrem angegebenen Wert. In Ihrem Fall, Ihre stub GetUser zurückgeben muss ein mock von Benutzer, mit seinen PasswordQuestion gekürzte Weg zurück "Passwort".
Anderes problem mit deinem code ist, dass Sie Spott MembershipProvider direkt. Wie die meisten von mocking-framework arbeiten, wenn Sie mock eine Schnittstelle, die Sie generieren dynamisch eine Klasse, die es implementiert, und wenn Sie ein mock-Klasse, erzeugen Sie eine Klasse, die erbt und überschreibt die virtuelle Methode. Jedoch, wenn die Methode ist nicht virtuell, es kann nicht überschrieben werden, daher auch das gemischte Verhalten, das Sie beobachten können. Ich schlage vor, Sie sehen, ob es eine Schnittstelle wie IMembershipProvider und wenn ja, verwenden Sie diese in Ihrem code anstelle der konkreten Klasse.
Ich aktualisierte die Antwort. vergessen Sie nicht, upvote 🙂
MembershipProvider.GetUser() abstrakte Methode; MembershipUser.PasswordQuestion ist virtuelles Eigentum
InformationsquelleAutor zvolkov