В пакете Visual Studio можно ли имитировать (DTE) GetService(typeof (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() в моих тестах.

2 ответа

Решение

То, как я в конечном итоге "решил" это было издеваться EnvDTE.Solution вместо этого (кажется, что это может быть сделано только в Package_IntegrationTests проект, который создан для вас - вы не можете ссылаться EnvDTE в любом другом проекте). Я не мог понять, как использовать методы в Utils.cs как предложено Карлосом ниже, чтобы открыть мои существующие решения.

Предполагая, что вы имеете в виду интеграционные тесты (а не модульные тесты), где вам нужно загрузить свой пакет в реальном экземпляре 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)

Другие вопросы по тегам