单元测试w/Moq of Excel Interop + Type.Missing
问题描述:
我刚刚遇到一个例外,写单元测试时我无法解释自己。单元测试w/Moq of Excel Interop + Type.Missing
(简化)代码,我想测试的是:
public object GetSecondColumn(Microsoft.Office.Interop.Excel.Range theRange)
{
return theRange.Columns[2, Type.Missing];
}
我试着写这个测试,但我不断收到一个例外:
//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吗?
答
IMO您缺少Columns
方法的Setup
。此方法需要设置,因为它在函数GetSecondColumn
中调用。如果没有设置Columns
是null
:
所以设置了Columns
例如喜欢这个。这里的Columns
返回expected
为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);
}