visual studio扩展(VSPackage)将项添加到Test Explorer上下文菜单

时间:2014-02-03 17:26:34

标签: visual-studio unit-testing vspackage

我正在使用VSPackage编写Visual Studio 2012的扩展。我需要在Test Explorer中添加一个上下文菜单项,点击这个菜单项,我需要获得所选的单元测试。我尝试使用

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

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

DTE.Events.CommandBarEvents[command].Click

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

然后,我发现我需要通过VSPackage中的VSCT文件添加命令。但是,我无法找到测试窗口上下文菜单,以便我可以将命令附加到它。另外,我需要获得Test Explorer中列出的所有单元测试(TestCase对象)。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

通常这些是我查找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。

答案 1 :(得分:0)

我写了一些探索性代码来循环上下文菜单中的命令。我还参与了注册优先级命令目标并查看我获得的组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/en-us/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);

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