繁体   English   中英

Visual Studio扩展(VSPackage)将项目添加到Test Explorer上下文菜单

[英]visual studio extension (VSPackage) add items to Test Explorer context menu

我正在使用VSPackage编写Visual Studio 2012的扩展。 我需要在“测试资源管理器”中添加一个上下文菜单项,然后单击此菜单项,就需要获取所选的单元测试。 我尝试使用添加项目

((CommandBars)DTE.CommandBars)["Test Window Context Menu"].Controls.Add(Type: MsoControlType.msoControlButton);

并通过订阅事件来添加事件处理程序

DTE.Events.CommandBarEvents[command].Click

我成功将一个项目添加到上下文菜单,但是Click事件处理程序从未被触发。 MSDN说,我需要将命令的OnAction属性设置为有效的字符串值,以使Click事件处理程序被触发。 它也不起作用。

然后,我发现我需要通过VSPackage中的VSCT文件添加命令。 但是,我找不到“测试窗口上下文”菜单,因此无法将命令附加到它。 另外,我需要获取“测试资源管理器”中列出的所有单元测试(TestCase对象)。

任何帮助是极大的赞赏!

通常这些是我在寻找Visual Studio Shell GUID或命令,上下文菜单,组等ID的文件:

  • C:\\ Program Files(x86)\\ Microsoft Visual Studio 11.0 \\ VSSDK \\ VisualStudioIntegration \\ Common \\ Inc \\ stdidcmd.h
  • C:\\ Program Files(x86)\\ Microsoft Visual Studio 11.0 \\ VSSDK \\ VisualStudioIntegration \\ Common \\ Inc \\ vsshlids.h

实际上,它们包含在您新创建的.vsct文件(<Extern href =“ vsshlids.h” />)的顶部。 我想您已经检查过了。 我进行了快速搜索,但是发现“测试”只是一个功能区和一个测试对话框。 可能现在您正在寻找。 对于某人找到此帖子可能仍然有用。

您可能还想尝试一下蛮力风格:在程序文件(x86)\\ Visual Studio [VERSION]中搜索正则表达式:^#define。* TEST。* $这将为您提供包含TEST的定义。

另外,您可能需要考虑直接询问Microsoft。

我编写了一些探索性代码来遍历该上下文菜单中的命令。 我还尝试注册优先级命令目标并查看获得的GUID组和命令ID。 该上下文菜单的GUID似乎为{1e198c22-5980-4e7e-92f3-f73168d1fb63} 您可能可以使用它通过.vsct文件添加命令,而无需使用DTE.CommandBars动态添加它。

这是我的实验代码,列出了该上下文菜单中当前命令的GUID和命令ID,以防它对任何人有所帮助。

var bars = ((Microsoft.VisualStudio.CommandBars.CommandBars)DTE.CommandBars);
var teContextMenu = bars["Test Window Context Menu"];
var ctls = teContextMenu.Controls;
foreach (var ctl in ctls)
{
    var cmdCtl = ctl as Microsoft.VisualStudio.CommandBars.CommandBarControl;
    string guid; int id;
    DTE.Commands.CommandInfo(ctl, out guid, out id);
    Debug.WriteLine($"{cmdCtl?.accName} {guid} {id}");
}

关于命令路由的这篇文章对我有所帮助: https : //docs.microsoft.com/zh-cn/visualstudio/extensibility/internals/command-routing-algorithm

我的实验性优先级命令目标(在其中设置断点以查看发送了什么GUID和命令ID)已注册如下。 TestCommandInterceptor类是IOleCommandTarget的基本实现。

var cmdService = GetService(typeof(SVsRegisterPriorityCommandTarget)) as IVsRegisterPriorityCommandTarget;
var target = new TestCommandInterceptor();
cmdService.RegisterPriorityCommandTarget(0, target, out _testCmdInterceptorRegistrationCookie);

我仍然想知道该问题第二部分有关如何确定所选测试的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM