在我的包中,我使用(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()
。
答案 0 :(得分:2)
假设您指的是需要在真实的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; }
}
如果您想了解VS IDE主机适配器的内置,我认为VS 2008 SDK是提供源代码和文档的最后一个SDK(http://msdn.microsoft.com/en-us/library/bb286982%28v=vs.90%29.aspx)
答案 1 :(得分:0)
我最终的方式解决了#39;这是模拟EnvDTE.Solution
而非(似乎只能在为您创建的Package_IntegrationTests
项目中完成 - 您无法在任何其他项目中引用EnvDTE
)。我无法弄清楚如何使用下面Carlos建议的Utils.cs
中的方法来打开我现有的解决方案。