C# 模拟DTE接口时MissingMethodException
我正在努力解决与VisualStudioSDK“EnvDTE”相关的测试问题。假设我有一个C#解决方案,它的NuGet依赖于、以及它们的所有可传递依赖项(该解决方案可以作为一个解决方案使用,以便于使用) 我的项目包含两个文件。包含一些简单的逻辑,可以向某些DTE接口中定义的事件添加(无意义的)侦听器C# 模拟DTE接口时MissingMethodException,c#,visual-studio,nunit,moq,envdte,C#,Visual Studio,Nunit,Moq,Envdte,我正在努力解决与VisualStudioSDK“EnvDTE”相关的测试问题。假设我有一个C#解决方案,它的NuGet依赖于、以及它们的所有可传递依赖项(该解决方案可以作为一个解决方案使用,以便于使用) 我的项目包含两个文件。包含一些简单的逻辑,可以向某些DTE接口中定义的事件添加(无意义的)侦听器 public class Foo { public static void Bar(Events e) { e.SolutionEvents.Opened += () =&g
public class Foo
{
public static void Bar(Events e)
{
e.SolutionEvents.Opened += () => { };
}
}
中定义的相应测试用例BarTest
,创建DTE接口的模拟实例,并将其作为参数传递给Foo.Bar
[Test]
public void BarTest()
{
var events = Mock.Of<Events>();
var solutionEvents = Mock.Of<SolutionEvents>();
Mock.Get(events).SetupGet(evts => evts.SolutionEvents).Returns(solutionEvents);
Foo.Bar(events);
}
private void XXX()
{
Events e = null;
e.SolutionEvents.Opened += () => { };
}
出于某种原因,XXX
的存在会影响测试运行,因为Moq似乎无法找到打开的事件的定义。我发现这种行为非常奇怪,我真的不明白是什么导致了这个问题。这是最小起订量的问题吗?它与COM类型的类加载有关吗
如果有比我聪明的人能解释这个问题,我将不胜感激。提前感谢!:) Visual Studio DTE/加载项SDK已弃用。您应该使用VSIXSDK;VSPackage;或托管包框架。我很感激您的提示,但据我所知,这需要我在扩展中放弃对2015年之前的Visual Studio版本的支持/你应该能够抽象出你的产品。我明白了。不过,我的实际代码仍在运行,因此现在,我更希望了解测试中出现此问题的原因,而不是升级生产代码。这就是为什么不推荐使用Visual Studio DTE/add-in SDK是注释而不是应答。您应该使用VSIXSDK;VSPackage;或托管包框架。我很感激您的提示,但据我所知,这需要我在扩展中放弃对2015年之前的Visual Studio版本的支持/你应该能够抽象出你的产品。我明白了。不过,我的实际代码仍在运行,所以现在,我更希望了解测试中出现此问题的原因,而不是升级生产代码。这就是为什么它是注释而不是答案
System.MissingMethodException : Error: Missing method 'instance void [MyProject] EnvDTE._dispSolutionEvents_Event::add_Opened(class EnvDTE._dispSolutionEvents_OpenedEventHandler)' from class 'Castle.Proxies.ObjectProxy_1'.
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.EventInfo.AddEventHandler(Object target, Delegate handler)
at System.Runtime.InteropServices.ComAwareEventInfo.AddEventHandler(Object target, Delegate handler)
at MyProject.Foo.Bar(Events e) in C:\Users\seb2\versioned\dte-mocking-minimal\MyProject\Foo.cs:line 25
at MyProject.Test.FooTest.BarTest() in C:\Users\seb2\versioned\dte-mocking-minimal\MyProject.Test\FooTest.cs:line 32