我有一个包含大约 500 个单元测试的 .NET 库项目。所有这些测试在 Visual Studio 2012 中运行良好。但是,我的一些测试在 Visual Studio 2010 中失败。在这些失败的测试中,我使用 起订量 模拟来自 Microsoft.Office.Interop.Excel
的几种互操作类型.尝试访问这些模拟互操作类型时,测试立即失败:
Error: Missing method 'instance class Microsoft.Office.Interop.Excel.Range [ExcelAddIn.Core] Microsoft.Office.Interop.Excel.ListRow::get_Range()' from class 'Castle.Proxies.ListRowProxy'.
这个异常意味着我忘记在我的模拟上设置适当的属性 getter。情况并非如此:
_listRowMock.Setup(m => m.Range).Returns(_rangeMock.Object);
现在我可以想象 Moq 可能不会与互操作类型一起很好地工作。但我觉得最令人费解的是,这些测试在 Visual Studio 2012 中运行良好,但在 Visual Studio 2010 中却失败了。
为什么我的 Visual Studio 会影响我的代码的行为?
更新:3-11-2012
好的,所以我把它归结为:
问题仍然存在:是什么导致了 Visual Studio 2010 和 Visual Studio 2012 之间的这种行为差异?
更新:2012 年 9 月 11 日
演示解决方案 :http://temp-share.com/show/KdPf6066h
我创建了一个小解决方案来演示效果。该解决方案由一个库和一个 UnitTest 项目组成。两者都引用启用了 EIT 的 Microsoft.Office.Interop.Excel.Range。该测试在 VS2012 中运行良好,但在 VS2010 中抛出 MissingMethodException。在测试中取消注释虚拟行将使其在 VS2010 中工作。
最终更新:29-12-2012
我很抱歉更新晚了。我的一个同事找到了一个解决方案,但是我无法在我的机器上重现它。与此同时,我们公司已经切换到 TFS2012,所以这对我来说不再是一个阻塞问题。我的同事得出的两个最重要的结论是:
Studio 2010 到 Visual Studio 2012。这将导致不同的
.DLL 的生成取决于您使用的是 VS2010 还是
VS2012。
我检查了我的项目并整理了引用资料,但没有任何区别。之后,我在 VS2010 和 VS2012 中尝试了不同的平台变体,但无法产生令人满意的结果。我会接受 Jeremy 的回答,因为它是最有帮助的。谢谢大家的帮助。
最佳答案
编辑:当我在 Visual Studio 2012 中尝试它并以 .Net 4.0 为目标时,它对我有用,只使用 .Net PIA 而不是 COM ref。同样的解决方案在 VS2010 中不起作用。
VS2010 加载版本的 Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll's
的 10.0.30319.1和 VS2012 加载版本的 11.0.50727.1。您可以在“模块”窗口中看到不同的版本。
我设法让它在 VS2010 中工作:
这是我的解决方案 http://temp-share.com/show/Pf3Ypip62为了大家的方便。它包含所有起订量引用。我有 Excel 2007(即 v12) - 所以请调整对 Office 14 的引用。
带有待测试方法的项目必须使用 PIA Microsoft.Office.Interop.Excel
通过 .Net 引用选项卡。
在单元测试项目中,您必须使用 Microsoft Excel 1X.0 Object Library
通过 COM 引用选项卡 - 它是一个 ActiveX。
The confusing thing is in Solution Explorer they are both called: Microsoft.Office.Interop.Excel
还有一个警告,我不知道如何解决 - 您必须使用 .Net 3.5 框架 我实际上希望微软在 2012 年修复它,因为你发现了 因为我无法处理 .Net 4.0 中的所有项目。一些针对 .Net 3.5 和 4.0 的混合项目解决方案是可以的。
我在这方面遇到了很多麻烦,请参阅此处 How do I avoid using dynamic when mocking an Excel.worksheet?还看到我问的这个问题:Mocked object doesn't have all properties shown in Intellisense - in one project but has them in the other .
无论如何,这是让它在 VS 2010 中工作的方法。我很高兴它在 2012 年得到解决!
关于c# - 最小起订量和互操作类型 : works in VS2012, 在 VS2010 中失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13202120/