Как протестировать пример интеграции языка Ook? - PullRequest
3 голосов
/ 06 октября 2011

Я пишу пользовательский языковой раскрашиватель как расширение Visual Studio, используя MEF. Большая часть моего кода взята из примера интеграции языка Ook, который доступен здесь . Мой колоризатор в значительной степени готов, но теперь мне нужно предоставить соответствующий набор модульных тестов для моей реализации.

Учитывая MEF-природу этого материала, мне интересно, какой подход подходит для модульного тестирования. Должен ли я просто ссылаться на мой Tagger из моего модульного теста и протестировать метод GetTags? Должен ли я привлекать MEF к своим юнит-тестам? Существуют ли какие-либо примеры о тестировании колоризаторов на основе MEF и пользовательских реализаций Intellisense?

1 Ответ

2 голосов
/ 07 октября 2011

ОК, так что я думаю, что у меня есть подход, чтобы сделать это. Не знаю, если это идеальный подход, но позволяет мне проверить мою основную логику. Авторы благодарности получают парни из HQL Language Service для Visual Studio , которые показали мне, как создавать заглушки для ITextSnapshots, и Ной Ричардс , чье расширение Spell Checker имеет как набор юнит-тестов, которые устанавливают сценарий для моих.

Вот код для моей TestFixture:

[TestFixture]
public class TokenTaggerTests
{
  [Test]
  public void CanGetTagsForSimpleSelect()
  {
    TestQuery("SELECT * FROM Books", new List<string>() { "SELECT", "*", "FROM", "Books"});      
  }

  private void TestQuery(string query, List<string> expected)
  {
    ITextSnapshot snapshot = SnapshotUtil.CreateSnapshot(query);
    NormalizedSnapshotSpanCollection spans = new NormalizedSnapshotSpanCollection(snapshot.CreateSpanFromLineNumber(0));

    MyTokenTagProvider provider = new MyTokenTagProvider();
    ITagger<ITag> tagger = provider.CreateTagger<ITag>(new Mock<ITextBuffer>().Object);

    List<string> words = tagger.GetTags(spans).Select(s => query.Substring(s.Span.Start, s.Span.Length)).ToList();

    string errorMessage = string.Format("Got list: [{0}].  Expected: [{1}]", string.Join(", ", words), string.Join(", ", expected));

    CollectionAssert.AreEqual(expected, words, errorMessage);
  }
}

В методе TestQuery я начинаю с вызова CreateSnapshot для SnapshotUtil. Это полезный класс, найденный в тестовом проекте HQL Language Service, который будет создавать объекты ITextSnapshot на основе некоторого входного текста, который имитирует то, что VS предоставит моему расширению. Затем я иду и использую MyTokenTagProvider для создания тега для меня. Здесь я использую эту мощную вещь под названием Moq , чтобы создать Mock объекта ITextBuffer, который является ожидаемым входным параметром для CreateTagger.

Теперь, когда у нас есть тегер, остальные просто играют с ним, чтобы проверить, выполняет ли он эту работу. GetTags - это основной метод, который я хочу протестировать здесь, поскольку он будет принимать мой входной запрос и выводить серию тегов, которые он смог идентифицировать. Чтобы получить реальные слова, мы исследуем диапазон каждого тега и используем его для извлечения слова из исходного запроса. Метод CollectionAssert NUnit обеспечит соответствие выходного списка слов ожидаемому списку.

Надеюсь, это полезно для всех, кто создает и тестирует расширения редактора VS.

...