C# 绑定到Excel应用程序事件时缺少MethodException

C# 绑定到Excel应用程序事件时缺少MethodException,c#,excel,unit-testing,vsto,moq,C#,Excel,Unit Testing,Vsto,Moq,我试图为我创建的Excel VSTO插件创建单元测试,但我遇到了一个难以置信的神秘问题,感觉远远超出了我的经验 在这种情况下,我有一个演示者: public class Presenter { private readonly Excel.Application Application; public Presenter(Excel.Application Application) { this.Application = Application; Applica

我试图为我创建的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
  // ...
}
这个测试确实通过了,这意味着我的第一个测试应该是有效的,因为它正确地处理了事件。但更奇怪的是,将此测试包含到我的unit test.cs文件中会导致以前失败的test-testLogicWhenWorkBookActivate通过


这些测试是完全独立的。为什么第二个会导致第一个通过?

经过一些额外的研究和实验,我相信我已经解决了我的问题。我不是互操作方面的专家,所以如果我在这里得出任何错误的结论,请随时编辑或更正我

我参与了两个项目:

ExcelAddIns.TestControl ExcelAddIns.TestControl.Tests 两者都需要VSTO引用,包括Microsoft.Office.Interop.Excel等。所有VSTO引用都将嵌入互操作类型设置为true,我认为这是默认值。根据我所阅读的内容,请参见下面的参考资料,这是问题的关键,因为它有效地分离了程序集的嵌入类型,在我的单元测试引用TestControl项目时导致冲突

因此,我的解决方案是将两个项目中的所有VSTO程序集引用的嵌入互操作类型设置为false。这导致单元测试在没有第二次测试的情况下通过

参考资料:


经过一些额外的研究和实验,我相信我已经解决了我的问题。我不是互操作方面的专家,所以如果我在这里得出任何错误的结论,请随时编辑或更正我

我参与了两个项目:

ExcelAddIns.TestControl ExcelAddIns.TestControl.Tests 两者都需要VSTO引用,包括Microsoft.Office.Interop.Excel等。所有VSTO引用都将嵌入互操作类型设置为true,我认为这是默认值。根据我所阅读的内容,请参见下面的参考资料,这是问题的关键,因为它有效地分离了程序集的嵌入类型,在我的单元测试引用TestControl项目时导致冲突

因此,我的解决方案是将两个项目中的所有VSTO程序集引用的嵌入互操作类型设置为false。这导致单元测试在没有第二次测试的情况下通过

参考资料:

[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);
}