【发布时间】:2014-04-15 16:33:21
【问题描述】:
我正在尝试为我创建的 Excel VSTO 加载项创建单元测试,但我遇到了一个令人难以置信的神秘问题,感觉远远超出了我的经验。
在这种情况下,我有一个演示者:
public class Presenter
{
private readonly Excel.Application Application;
public Presenter(Excel.Application Application)
{
this.Application = Application;
Application.WorkbookActivate += Application_WorkbookActivate;
}
private void Application_WorkbookActivate(Excel.Workbook Wb)
{
// logic to be tested
}
}
我的单元测试是验证当WorkbookActivate被调用时,它会执行一个特定的动作,例如:
[Test]
public void TestLogicWhenWorkbookActivates()
{
var mockApplication = new Mock<Excel.Application>();
presenter = new Presenter(mockApplication.Object);
// Act
mockApplication.Raise(a => a.WorkbookActivate += null, (Excel.Workbook)null);
// Assert
// ...
}
现在,当我运行这个测试时,添加事件时它会失败(发生在演示者的构造函数中),抛出以下内容:
System.MissingMethodException : Error: Missing method 'instance void [ExcelAddIns.TestControl] Microsoft.Office.Interop.Excel.AppEvents_Event::add_WorkbookActivate(class Microsoft.Office.Interop.Excel.AppEvents_WorkbookActivateEventHandler)' from class 'Castle.Proxies.ApplicationProxy'.
根据this related Stack Overflow post,我的理解是我正在执行的是第三方回调,并且在 Moq 4.0 之前失败了。我正在使用最小起订量 4.2.1402.2112。
所以这是奇怪的部分:在那个 Stack Overflow 答案中,提到了 Moq 错误报告,它拥有一个单元测试来测试这个概念:
[Test]
public void InteropExcelTest()
{
var mockAppExcel = new Mock<Excel.Application>();
bool isDelegateCalled = false;
mockAppExcel.Object.WorkbookActivate += delegate { isDelegateCalled = true; };
mockAppExcel.Raise(ae => ae.WorkbookActivate += null, (Excel.Workbook)null);
Assert.True(isDelegateCalled);
}
这个测试确实通过了,这意味着我的第一个测试应该是有效的,因为它正在正确处理事件。但更奇怪的是,将此测试包含在我的单元测试 .cs 文件中会导致之前失败的测试 (TestLogicWhenWorkbookActivates) 通过!
这些测试是完全独立的。为什么第二个的存在会导致第一个通过?
【问题讨论】:
标签: c# excel unit-testing vsto moq