ОК, так что я думаю, что у меня есть подход, чтобы сделать это. Не знаю, если это идеальный подход, но позволяет мне проверить мою основную логику. Авторы благодарности получают парни из 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.