【问题标题】:visual studio extension (VSPackage) add items to Test Explorer context menuVisual Studio 扩展(VSPackage)将项目添加到测试资源管理器上下文菜单
【发布时间】:2014-02-03 17:26:34
【问题描述】:

我正在使用 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 unit-testing vspackage


    【解决方案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 文件的顶部()。我猜你已经检查过了。我进行了快速搜索,但我找到的“测试”只是一个测试功能区和一个测试对话框。可能现在你正在寻找。对于找到此帖子的人来说,它可能仍然有用。

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

    您也可以考虑直接询问微软。

    【讨论】:

      【解决方案2】:

      我编写了一些探索性代码来循环该上下文菜单中的命令。我还尝试注册一个优先命令目标并查看我得到的组 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);
      

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

      【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2011-12-24
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      相关资源
      最近更新 更多