在Visual Studio软件包中,我可以模拟(DTE)GetService((DTE的类型)进行测试吗
本文关键字:DTE 类型 测试 GetService Studio 我可以 模拟 Visual 软件包 | 更新日期: 2023-09-27 18:28:15
在我的包中,我使用(DTE) GetService(typeof (DTE))
来获取有关当前打开的解决方案的信息。有没有一种方法可以在测试中模拟这一点,特别是让我可以使用dte.Solution.SolutionBuild
进行构建?
主包装类别中的代码:
var solutionModel = new SolutionModel(((DTE) GetService(typeof (DTE))).Solution);
SolutionModel
类(剥离):
public class SolutionModel
{
private readonly Solution _packageSolution;
public SolutionModel(Solution solution)
{
_packageSolution = solution;
}
public SolutionModel() {} // This constructor is used for tests so _packageSolution will be null
public bool Build()
{
if (_packageSolution != null)
{
var buildObject = _packageSolution.SolutionBuild;
buildObject.Build(true);
return buildObject.LastBuildInfo == 0;
}
return ManualCleanAndBuild(); // current messy alternative way of doing the build for tests
}
}
因此,我希望能够在测试中使用_packageSolution
构建,而不是ManualCleanAndBuild()
。
假设您引用的是集成测试(而不是单元测试),您需要在真实的Visual Studio实例中加载包,这取决于您使用的测试框架。如果您将MSTest与VSIDE主机适配器一起使用(如果您在向导的最后一页中标记复选框,则包向导将创建集成测试项目),则有一个Utils.cs文件使用静态VsIdeTestHostContext类来获取DTE实例或服务:
public static class VsIdeTestHostContext
{
[CLSCompliant(false)]
public static DTE Dte { get; }
public static IServiceProvider ServiceProvider { get; set; }
}
如果你想了解VSIDE主机适配器的内部,我认为VS2008SDK是最后一个提供源代码和文档的SDK(http://msdn.microsoft.com/en-us/library/bb286982%28v=vs.90%29.aspx)
我最终"解决"这一问题的方法是模拟EnvDTE.Solution
(似乎只能在为您创建的Package_IntegrationTests
项目中完成——您不能在任何其他项目中引用EnvDTE
)。我不知道如何使用下面Carlos建议的Utils.cs
中的方法来打开我现有的解决方案。