nSubstituteはRefパラメーターをサポートしていますか?
-
05-10-2019 - |
質問
iterfaceに次のメソッド署名があります。
void SetItem(ref AddressItem item);
私はこのようなパラメーター制約をします:
IAddAddressForm form = Substitute.For<IAddAddressForm>();
AddressItem item = null;
form.SetItem(Arg.Is(item));
しかし、それはrefのために失敗します。 Refを取り出した場合、正常に機能します。しかし、ここで参照する必要があります。
これを取得する方法はありますか?
サイドノート:私の最終的な目標は、渡された値がnullである場合、setitemに例外をスローすることです。それを手伝うことができれば、余分なポイントが得られます!
解決
nsubstituteは、ARGマッチングREFパラメーターを直接サポートしていませんが、一般にそれらはOKで機能します。
私はあなたが使用しなければならないと仮定するつもりです ref
あなたの質問で述べたように、しかし明らかにあなたが避けることができるなら ref
APIはより簡単になり、テストするように(使用するフレームワークに関係なく)。
当面の質問に答えて、2番目のコードサンプルを次のように更新してREFを渡すことができます。
form.SetItem(ref item);
あなたのサイドノートについては、あなたがあまりにも多くの行動をあなたの代替物に押し込もうとしていないことを確認してください。これを行うたびに、テストしているクラスとその依存関係の間の通信を簡素化するために必要なサインであることがわかりました。 (または、偽のオブジェクトに実際に多くのロジックが必要な場合は、生成するのではなく、1つを手でコードします。
この呼び出しを取得して例外をスローする方法はいくつかあります。
form.When(x => x.SetItem(ref item)).Do(x => { throw new ArgumentNullException(); });
これは、null refで呼び出された場合にのみ例外をスローします。また、渡された引数に応じてこの動作を選択的に追加することもできますが、おそらくあなたがあなたの代替品にあまりにも多くを押し込んでいる兆候であるため、私はこれに反対することをお勧めします。
form.WhenForAnyArgs(x => x.SetItem(ref item))
.Do(x => {
if (x[0] == null)
throw new ArgumentNullException();
});
最後に、テストしているクラスがIADDADDDRESFORFがARG NULL例外をスローしたときに適切に応答することを確認する場合、おそらくこれを行うだけです。
form
.WhenForAnyArgs(x => x.SetItem(ref item))
.Do(x => { throw new ArgumentNullException(); });
そうすれば、引数が何であるかは本当に気にしませんが、テストしているコードがこのケースに適切に反応することを確認するだけです。
お役に立てれば。
サイドノート:
Arg Matcherを使用したい場合( Arg.Any<AddressItem>()
) out
また ref
コール自体の外側で定義する必要があります(これは少しエラーが発生しやすい場合があります。呼び出しに入るのと同じ順序でマッチャーを定義することを確認する必要があります):
IAddAddressForm form = Substitute.For<IAddAddressForm>();
AddressItem item = Arg.Is<AddressItem>(y => y.Number == 14);
form
.When(x => x.SetItem(ref item))
.Do(x => { throw new ArgumentNullException(); });
var address = new AddressItem { Number = 14 };
form.SetItem(ref address);