Ich habe ein seltsames Problem bei der Verwendung von NSubstitute ein paar Mal gerannt und obwohl ich weiß, wie man es umgehen kann, konnte ich es nie erklären.Rückgabe des Ergebnisses einer Methode, die einen anderen Ersatz zurückgibt, löst eine Ausnahme in NSubstitute aus
Ich habe den minimal erforderlichen Test erstellt, um das Problem zu beweisen, und es scheint etwas mit der Verwendung einer Methode zum Erstellen eines ersetzten Rückgabewerts zu tun zu haben.
public interface IMyObject
{
int Value { get; }
}
public interface IMyInterface
{
IMyObject MyProperty { get; }
}
[TestMethod]
public void NSubstitute_ReturnsFromMethod_Test()
{
var sub = Substitute.For<IMyInterface>();
sub.MyProperty.Returns(MyMethod());
}
private IMyObject MyMethod()
{
var ob = Substitute.For<IMyObject>();
ob.Value.Returns(1);
return ob;
}
Wenn ich laufe den obigen Test ich die folgende Ausnahme erhalten:
Test method globalroam.Model.NEM.Test.ViewModel.DelayedAction_Test.NSubstitute_ReturnsFromMethod_Test threw exception:
NSubstitute.Exceptions.CouldNotSetReturnException: Could not find a call to return from.
Make sure you called Returns() after calling your substitute (for example: mySub.SomeMethod().Returns(value)).
If you substituted for a class rather than an interface, check that the call to your substitute was on a virtual/abstract member.
Return values cannot be configured for non-virtual/non-abstract members.
Allerdings, wenn ich die Testmethode ändern, um dies zurück:
sub.MyProperty.Returns((a) => MyMethod());
oder dieses:
Es funktioniert .
Ich frage mich nur, ob jemand erklären kann, warum das passiert?
Danke für die ausführliche Antwort. Es ist viel komplizierter als ich erwartet habe. Denken Sie, dass dies ein Fehler in NHibernate ist? Ich nehme an, dass es sich um ein bekanntes Problem handelt, das ziemlich komplex zu beheben ist. – craftworkgames
Es ist eine Einschränkung der Wahl der Syntax. Die Änderung von NSub, um explizite, lokale SubstituteFactories zu verwenden, könnte helfen (wir könnten eine Menge an Status pro Test beibehalten und durchsuchen, anstatt globalen Status), aber nicht sicher, ob die Leute bereit wären, die Syntax zum Erstellen von Subs zu komplizieren. Ich denke, mir wäre das lieber, aber ich bin mir nicht sicher, ob es ein Problem ist, das groß genug ist, um Veränderungen an dieser Stelle zu rechtfertigen. –
Das eigentliche Problem ist, dass der Code aus jedem Blickwinkel korrekt war, so dass es schwierig war, das Problem zu diagnostizieren. Vielleicht helfen bessere Fehlermeldungen, aber ich habe keine Ahnung, was sie sein könnten. Danke noch einmal. – craftworkgames