pbaelen
pbaelen

Reputation: 11

Unit test w/ Moq of Excel Interop + Type.Missing

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

Answers (1)

gembird
gembird

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:

enter image description here

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

Related Questions