unit testingw / Moq的Excel Interop + Type.Missing

我刚刚遇到一个例外,在编写unit testing的时候我无法解释自己。

(简化)我想testing的代码是:

public object GetSecondColumn(Microsoft.Office.Interop.Excel.Range theRange) { return theRange.Columns[2, Type.Missing]; } 

我试图写这个testing,但我不断收到一个例外:

 //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); 

方法的调用抛出:

 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 **** 

我不能使用It.IsAny()处理Type.Missing / Missing.Value吗?

国际海事组织你错过了Setup Columns方法。 这个方法需要被设置,因为它在函数GetSecondColumn 。 没有设置Columnsnull

在这里输入图像说明

所以像这样设置Columns 。 在这里, Columns返回所有types为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); }