我想模拟 Microsoft.Office.Interop.Excel.Range(和其他 Microsoft.Office.Interop.Excel 接口)来对我的应用程序进行单元测试。我正在使用 Moq 4.0.10827 和 .NET 4 在 C# 中。
在我的单元测试中,我尝试设置模拟的行为如下:
var range = new Mock<Microsoft.Office.Interop.Excel.Range>();
range.Setup(r => r.get_Value(1)).Returns("Something");
var classBeingTested = new MyClass(range.Object);
在进行单元测试的代码中,我使用范围(Range)如下:
public MyClass(Range range)
{
var value = range[1].ToString();
}
当测试运行时,会产生以下异常:
Error: Missing method 'instance object [My.Example.Implementation.MyClass] Microsoft.Office.Interop.Excel.Range::get__Default(object,object)' from class 'Castle.Proxies.RangeProxy'.
如何成功实现模拟?我意识到使用像https://dev59.com/OWkx5IYBdhLWcg3wCP6Y#9486226这样的模式来隔离Excel Interop功能是一种潜在的解决方案;但我更喜欢能够从Microsoft.Office.Interop.Excel接口创建模拟。
编辑:有关此问题的更多详细信息
好吧,这很奇怪。我创建了一个项目来测试jimmy_keen的建议。它有效。但是,当我使用相同的建议测试我遇到问题的项目时, 它会抛出以下异常:
Error: Missing method 'instance object [My.Example.Implementation.MyClass] Microsoft.Office.Interop.Excel.Range::get__Default(object,object)' from class 'Castle.Proxies.RangeProxy'.
由于jimmy_keen的建议在其他项目上运行良好,我开始怀疑正在测试代码的项目存在问题。因此,我创建了一个测试解决方案以详细说明问题:http://www7.zippyshare.com/v/70834394/file.html 问题的根源似乎是该项目包含另一个类(未进行单元测试),其基本上具有以下代码:
using Microsoft.Office.Interop.Excel;
namespace Project
{
public class UnTestedClass
{
public UnTestedClass(Worksheet sheet)
{
var foo = sheet.Range["Description"].Column;
}
}
}
我不明白为什么会出现这个问题,因为我在单元测试中根本没有使用UnTestedClass。我是不是在使用Moq时漏掉了什么,还是说我碰巧遇到了一个bug?