Reputation: 11
I just encountered an exception I can't explain myself while writing unit test.
(simplified) code i want to test is :
public object GetSecondColumn(Microsoft.Office.Interop.Excel.Range theRange)
{
return theRange.Columns[2, Type.Missing];
}
I tried to write this test but I keep getting an exception :
//Arrange
var usedRange = new Mock<Range>();
var result = new Mock<Range>();
usedRange .Setup(m => m[It.IsAny<object>(), It.IsAny<object>()]).Returns(
(object r, object c) =>
{
return result.Object;
});
//Assert
GetSecondColumn(usedRange);
Method's call throws :
System.ArgumentException
Message=Missing parameter does not have a default value.
Parameter name: parameters
StackTrace:
at System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig)
at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at System.Delegate.DynamicInvoke(Object[] args)
at Moq.Extensions.InvokePreserveStack(Delegate del, Object[] args)
at Moq.MethodCallReturn`2.Execute(ICallContext call)
at Moq.ExecuteCall.HandleIntercept(ICallContext invocation, InterceptorContext ctx, CurrentInterceptContext localctx)
at Moq.Interceptor.Intercept(ICallContext invocation)
at Moq.Proxy.CastleProxyFactory.Interceptor.Intercept(IInvocation invocation)
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at Castle.Proxies.ObjectProxy_3.get__Default(Object RowIndex, Object ColumnIndex)
at ****
Can't I handle Type.Missing / Missing.Value with It.IsAny() ?
Upvotes: 1
Views: 474
Reputation: 14053
IMO you are missing the Setup
of the Columns
method. This method needs to be setup because it is called in the function GetSecondColumn
. Without setup Columns
is null
:
So setup the Columns
e.g. like this. Here the Columns
returns expected
for any arguments of type object
. HTH
[TestMethod]
public void GetSecondColumn_WhenCalled_ReturnsSomeExpectedResult()
{
// Arrange
const string expected = "Expectd Value To Return";
var rangeMock = new Mock<Range>();
var fakeResultRange = new Mock<Range>();
fakeResultRange.Setup(range => range[It.IsAny<object>(), It.IsAny<object>()]).Returns(expected);
rangeMock.Setup(range => range.Columns).Returns(() => fakeResultRange.Object);
ClassToUnitTest cut = new ClassToUnitTest();
// Act
var actual = cut.GetSecondColumn(rangeMock.Object);
// Assert
Assert.AreEqual(expected, actual);
}
Upvotes: 1