Using the NSubstite framework for mocking in c# unit testing project and recently we created version2 API controller and business and repositories. But when created the tests for the controller the very first case is failing in Azure build pipeline. The same test case running without error with status as pass. I have tried all the ways from blogs but no luck. here is the error and code.
ERROR:
Test method XXX threw exception:
NSubstitute.Exceptions.RedundantArgumentMatcherException: Some argument specifications (e.g. Arg.Is, Arg.Any) were left over after the last call.
This is often caused by using an argument spec with a call to a member NSubstitute does not handle (such as a non-virtual member or a call to an instance which is not a substitute), or for a purpose other than specifying a call (such as using an arg spec as a return value). For example:
var sub = Substitute.For<SomeClass>();
var realType = new MyRealType(sub);
// INCORRECT, arg spec used on realType, not a substitute:
realType.SomeMethod(Arg.Any<int>()).Returns(2);
// INCORRECT, arg spec used as a return value, not to specify a call:
sub.VirtualMethod(2).Returns(Arg.Any<int>());
// INCORRECT, arg spec used with a non-virtual method:
sub.NonVirtualMethod(Arg.Any<int>()).Returns(2);
// CORRECT, arg spec used to specify virtual call on a substitute:
sub.VirtualMethod(Arg.Any<int>()).Returns(2);
To fix this make sure you only use argument specifications with calls to substitutes. If your substitute is a class, make sure the member is virtual.
Another possible cause is that the argument spec type does not match the actual argument type, but code compiles due to an implicit cast. For example, Arg.Any<int>() was used, but Arg.Any<double>() was required.
NOTE: the cause of this exception can be in a previously executed test. Use the diagnostics below to see the types of any redundant arg specs, then work out where they are being created.
Diagnostic information:
Remaining (non-bound) argument specifications:
any Int64
any Int64
All argument specifications:
any Int64
any Int64
any Int64
any Int64
Stack trace
at NSubstitute.Core.Arguments.ArgumentSpecificationsFactory.Create(IList`1 argumentSpecs, Object[] arguments, IParameterInfo[] parameterInfos, MethodInfo methodInfo, MatchArgs matchArgs)
at NSubstitute.Core.CallSpecificationFactory.CreateFrom(ICall call, MatchArgs matchArgs)
at NSubstitute.Routing.Handlers.RecordCallSpecificationHandler.Handle(ICall call)
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()
at NSubstitute.Proxies.CastleDynamicProxy.ProxyIdInterceptor.Intercept(IInvocation invocation)
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at Castle.Proxies.ObjectProxy_4.GetTemplateByApplicationIdTemplateId(Int64 applicationId, Int64 templateId)
at XXX() in YYY.cs:line 61
public Interface XXX
{
long Process(long x, string y, out string z);
}
[TestMethod]
public void XXX()
{
XXX _business = Substitute.For<XXX>();
Object model = GetFakeModel();
_business.Process(Arg.Any<long>(), Arg.Any<string>(), out Arg.Any<string>())
.Returns(x => { x[2] = "Success"; return 1; });
var _controller = new YYY(_business);
var result = _controller.Post(1, model) as ObjectResult;
Assert.IsNotNull(result);
}
How can we solve this problem. even i cant debug as its passing in the local machine. Tried running tests in sequential by adding a annotation [DoNotParallelize] but no luck.