我正在使用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对象)。
非常感谢任何帮助!
答案 0 :(得分:1)
通常这些是我查找Visual Studio shell GUID或命令,上下文菜单,组等ID的文件:
实际上它们包含在新创建的.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);
我仍然想知道关于如何确定所选测试的问题第二部分的答案。