NSubstituteを数回使用している間に奇妙な問題に遭遇しましたが、回避方法を知っていますが、別の代理を返すメソッドの結果を返すと、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);
。
これがなぜ起こるのか誰かが説明できるかどうかは疑問です。
詳細な回答ありがとうございます。予想以上に複雑です。これはNHibernateのバグとみなされますか?私はあなたの答えによって、それは既知の問題であり、修正するのがむしろ複雑であると分かります。 – craftworkgames
構文の選択には制限があります。 NSubを明示的な局所SubstituteFactoryを使用するように変更すると、テストごとに大量の状態を保持し、グローバルな状態ではなく検索することができますが、サブ作成の構文を複雑にしてもかまいません。私はそれを好むだろうと思うが、この時点で変更を正当化するのに十分な大きさの問題かどうかはわからない。 –
実際の問題は、すべての角度からコードが正しいように見えるため、問題を診断するのが難しいことでした。おそらく、より良いエラーメッセージが役立つかもしれませんが、私は彼らが何であるか分かりません。再度、感謝します。 – craftworkgames