在Visual Studio软件包中,我可以模拟(DTE)GetService((DTE的类型)进行测试吗



在我的包中,我使用(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中的方法来打开我现有的解决方案。

最新更新