在Visual Studio包中,我可以模拟(DTE)GetService(typeof(DTE))进行测试吗?

时间:2014-10-28 22:16:52

标签: c# visual-studio envdte vspackage

在我的包中,我使用(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()

2 个答案:

答案 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中的方法来打开我现有的解决方案。