Утверждения (контракты) и юнит-тестирование - PullRequest
2 голосов
/ 28 мая 2010

скажи, у меня есть метод

public void PrintStuff(string stuff, Color color, PageDimensions dimensions)
{
     Assert.IsNotNull("color");
     Assert.IsNotNull(dimensions);
     Assert.IsTrue(dimensions.width < 20.0);
}

и у меня есть другой метод AnotherMethod(), который вызывает PrintStuff(). Давайте предположим, что PrintStuff() определено в некоторых интерфейсах, которые использует AnotherMethod(). Вопрос: при написании модульного теста для AnotherMethod() как я могу автоматизировать проверку того, что AnotherMethod() не передает никакие значения в PrintStuff(), которые нарушают его утверждения?

Что-то вроде:

printer.Expect(x => x.PrintStuff(null, null, null)).CheckAssertions();

Решение должно автоматически поддерживать изменение утверждений.

1 Ответ

4 голосов
/ 28 мая 2010

Если PrintStuff находится в интерфейсе, но ваши утверждения находятся в конкретном классе, кто скажет, что одни и те же утверждения применяются ко всем реализациям? Похоже, что вы действительно хотите заключить контракты с интерфейсом , а не с конкретным классом. Очевидно, вы не можете сделать это в «нормальном» коде C # ...

Теперь я бы предложил использовать Кодовые контракты , которые поддерживают наследование контрактов, включая интерфейсы. Если вы используете редакции Visual Studio Premium или Ultimate, у вас может быть статическая проверка статической проверки того, что вы не нарушаете утверждения. В противном случае, вы вернетесь к насмешкам, я верю. Теперь, если вы используете насмешку, я не думаю, что контракты будут автоматически получены, потому что они обычно применяются с использованием бинарного переписывания ... но я ожидаю, что инструменты в этой области скоро улучшатся. Конечно, в любом случае для насмешек обычно нужно указать входные данные, которые вы ожидаете, поэтому вы должны быть в состоянии убедиться, что они действительны, когда вы все равно пишете свои тесты.

Вы также можете посмотреть на Pex , который исследует ваш код и пытается его взломать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...