単体テストでは、nsubstitute を使用してビューを登録するときに、すべてのビューを置き換えました。ただし、ビューの 1 つを破棄しようとすると、(オブジェクト型の) プロパティの 1 つを null に設定するとエラーがスローされます。エラーは「値を null にすることはできません。パラメータ名: コレクション」です。
回避策として、nsubstitute を使用してこのプロパティの set メソッドをインターセプトし、引数が null の場合は無視するか、別の値に設定します。
私は多くのバリエーションを試しましたが、私が必要としているのは When..Do だと思いますが、それを実装する運はありません。これが私の最後の試みです:
var view = Substitute.For(new[] { registration.Interface }, new object[] { });
view.When(x => x.DataContext = Arg.Is<object>(null)).Do(x => x[0] = new object());
参考までに、nsubstitute エラーのスタック トレースを次に示します。
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at NSubstitute.Core.Arguments.SuppliedArgumentSpecifications..ctor(IDefaultChecker defaultChecker, IEnumerable`1 argumentSpecifications)
at NSubstitute.Core.Arguments.SuppliedArgumentSpecificationsFactory.Create(IEnumerable`1 argumentSpecifications)
at NSubstitute.Core.Arguments.MixedArgumentSpecificationsFactory.Create(IList`1 argumentSpecs, Object[] arguments, IParameterInfo[] parameterInfos)
at NSubstitute.Core.Arguments.ArgumentSpecificationsFactory.Create(IList`1 argumentSpecs, Object[] arguments, IParameterInfo[] parameterInfos, MatchArgs matchArgs)
at NSubstitute.Core.CallSpecificationFactory.CreateFrom(ICall call, MatchArgs matchArgs)
at NSubstitute.Core.GetCallSpec.FromCall(ICall call, MatchArgs matchArgs)
at NSubstitute.Core.ConfigureCall.SetResultForCall(ICall call, IReturn valueToReturn, MatchArgs matchArgs)
at NSubstitute.Routing.Handlers.PropertySetterHandler.Handle(ICall call)
at NSubstitute.Routing.Route.<>c__DisplayClass3.<Handle>b__0(ICallHandler x)
at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
at NSubstitute.Routing.Route.Handle(ICall call)
at NSubstitute.Core.CallRouter.Route(ICall call)
at NSubstitute.Proxies.CastleDynamicProxy.CastleForwardingInterceptor.Intercept(IInvocation invocation)
at Castle.DynamicProxy.AbstractInvocation.Proceed()