На мой взгляд, ваше беспокойство показывает, что существует проблема дизайна. У вас есть две отдельные обязанности:
- Преобразование префикса входной строки в токен
- Повторение вышеуказанной операции с отслеживанием "где я" во входной строке
Ваш текущий дизайн назначает эти два для одного объекта Parser. Вот почему вы не можете проверить две обязанности по отдельности. Лучшим вариантом было бы определить токенизатор для первой ответственности и парсер для второй. Извините, я слишком ржавый на C #, поэтому я буду писать Java.
Одна из проблем разработки токенизатора заключается в том, что он должен возвращать два значения: токен и количество использованной строки. В Java строки неизменны, поэтому я не могу изменить входной аргумент. Вместо этого я бы использовал StringReader, который представляет собой поток символов, которые вы можете использовать. Мой первый тест может быть:
@Test public void tokenizes_an_integer() {
Tokenizer tokenizer = new Tokenizer();
StringReader input = new StringReader("int a rest of the input");
Token token = tokenizer.tokenize(input);
assertEquals(new Token("a", "int"), token);
assertEquals(" rest of the input", input.toString());
}
Когда это пройдет, я мог бы написать тест для второй ответственности:
@Test public void calls_tokenizer_repeatedly_consuming_the_input() {
StringReader input = new StringReader("int a int b");
Parser parser = new Parser(input, new Tokenizer());
assertEquals(new Token("a", "int"), parser.nextToken());
assertEquals(new Token("b", "int"), parser.nextToken());
assertEquals(null, parser.nextToken());
}
Это лучше, но все же не идеально с точки зрения ремонтопригодности теста. Если вы решите изменить синтаксис токена «int», оба теста прервутся. В идеале вы хотели бы, чтобы сломался только первый. Одним из решений было бы использование поддельного токенизатора во втором тесте, который не зависит от реального.
Это то, что я все еще пытаюсь освоить. Одним из полезных ресурсов является книга «Растущее объектно-ориентированное программное обеспечение», которая очень хороша в отношении независимости и выразительности тестов.
Где печенье? : -)