我想模拟 Microsoft.Office.Interop.Excel.Range(和其他 Microsoft.Office.Interop.Excel 接口)来对我的应用程序进行单元测试。我在 C# 中使用 Moq 4.0.10827 和 .NET 4。
在我的单元测试中,我尝试按如下方式设置模拟的行为:
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://stackoverflow.com/a/9486226/1548950等模式隔离 Excel 互操作功能是一种潜在的解决方案;但是,如果能够从 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 方面遗漏了什么,或者我是否偶然发现了一个错误?