6. SetUp и TearDown
Цели обучения
В этом упражнении вы получите практический опыт использования атрибутов NUnit [SetUp] и [TearDown] для уменьшения дублирования кода в тестах.
Введение и мотивация
Хорошая практика всегда позволять тестовому коду очищаться после себя, и вам также часто нужно настраивать вещи перед запуском теста. Если у вас есть несколько тестов, то это может легко стать большим дублированием кода, и если ваш тест не удастся, ваша очистка может даже не быть запущена, если вы не обернули ее в блоки try и finally.
В качестве решения этой проблемы, NUnit имеет [SetUp] и [TearDown] атрибуты. Методы с этими атрибутами выполняются соответственно до и после всех классов. Если вы запускаете несколько тестов класса сразу, подготовка и очистка выполняются между каждым из них.
public class TestClass
{
[SetUp]
public void MySetUp() { ... }
[Test]
public void MyFirstTest() { ... }
[Test]
public void MySecondTest() { ... }
[TearDown]
public void MyTearDown() { ... }
}
2010 год
Импорт образец 6_SetUpTearDown.
В этом проекте есть класс с именем FileCreatorОн имеет два метода:
CreateEmptyFile(fileName)— Создает пустой файл в каталогеOutputFilesCreateFile(string fileName, string content)— Создает файл с указанным содержимым в каталогеOutputFiles
Улов в том, что он будет бросать DirectoryNotFoundException, если не существует вызова выхода OutputFiles в текущем каталоге. Вам нужно будет создать этот каталог внутри SetUp методом и удалить его снова после этого с помощью TearDown. Ваш тест может затем предположить, что он начинается с пустого каталога, что упрощает утверждение.
Подсказки
- Вы можете использовать
Directory.CreateDirectoryдля создания каталога. - Вы можете использовать
Directory.Deleteс установленным рекурсивным флагом (второй аргумент) для удаления каталога вместе со всеми его файлами. Directory.GetFilesможет быть использован для получения файлов в заданном каталоге.Path.Combineявляется удобным методом для объединения частей пути к файлу. Например, имя каталога и имя файла.
Решение
Задача может быть решена с помощью теста, подобного следующему:
[SetUp]
public void Setup()
{
Directory.CreateDirectory(FileCreator.k_Directory);
}
[Test]
public void CreatesEmptyFile()
{
var fileCreatorUnderTest = new FileCreator();
var expectedFileName = "MyEmptyFile.txt";
fileCreatorUnderTest.CreateEmptyFile(expectedFileName);
var files = Directory.GetFiles(FileCreator.k_Directory);
Assert.That(files.Length, Is.EqualTo(1), "Expected one file.");
var expectedFilePath = Path.Combine(FileCreator.k_Directory, expectedFileName);
Assert.That(files[0], Is.EqualTo(expectedFilePath));
}
[Test]
public void CreatesFile()
{
var fileCreatorUnderTest = new FileCreator();
var expectedFileName = "MyFile.txt";
var expectedContent = "TheFileContent";
fileCreatorUnderTest.CreateFile(expectedFileName, expectedContent);
var files = Directory.GetFiles(FileCreator.k_Directory);
Assert.That(files.Length, Is.EqualTo(1), "Expected one file.");
var expectedFilePath = Path.Combine(FileCreator.k_Directory, expectedFileName);
Assert.That(files[0], Is.EqualTo(expectedFilePath));
var content = File.ReadAllText(expectedFilePath);
Assert.That(content, Is.EqualTo(expectedContent));
}
[TearDown]
public void Teardown()
{
Directory.Delete(FileCreator.k_Directory, true);
}
Полный проект с решением можно найти в примере 6_SetUpTearDown.
Дополнительные ресурсы
- SetUp и TearDown