У меня возникла странная проблема при использовании NSubstitute несколько раз, и хотя я знаю, как обойти это, я никогда не мог объяснить это.
Я разработал то, что, как представляется, является минимально необходимым для доказательства проблемы, и похоже, что это связано с использованием метода для создания замещенного возвращаемого значения.
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;
}
Когда я запускаю вышеуказанный тест, я получаю следующее исключение:
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.
Однако, если я изменю метод проверки, чтобы вернуть это:
sub.MyProperty.Returns((a) => MyMethod());
или это:
var result = MyMethod();
sub.MyProperty.Returns(result);
Он работает.
Мне просто интересно, может ли кто-нибудь объяснить, почему это происходит?