Мне легко писать модульные тесты для алгоритмов. Например, sort(List)
, легко писать тесты как:Как объединить тестовый класс без логики?
list = [2, 1, 4];
assert(sort(list) == [1, 2, 4]);
Но я считаю, что это действительно трудно методы испытаний, которые не имеют никакой логики, никаких if
заявлений, просто набор вызовов.
Есть в основном два примера, которые я хотел бы получить ответ о том, как проверить их устройство:
Пример 1:
Скажем, у меня есть класс, который отвечает за написание некоторых данных файл, но эти данные записываются определенным образом внешними функциями (writeHeaderToFile
, writeSerializedData
и writeEndOfFile
).
данные не написано прямо, как это в файл, так что если данные что-то вроде:
{
list: [
"item 1",
"item 2"
],
name: "aaa"
}
Это не означает, что файл будет ни обычная версия этих данных (без белые пробелы), и это не будет простой сериализованной версией или зашифрованной версией в файл. Фактический бинарный файл будет для меня чем-то неизвестным. Все, что я знаю, это то, что я могу использовать эти 3 метода для правильного написания.
Этот файл также содержит некоторую другую информацию, которая не поступает непосредственно из этих 3 методов, таких как заголовок определенного типа (что опять же я не знаю, как оно будет представлено в двоичном файле).
То есть класс:
class FileCreator {
populateFileWithData(File file, Data data) {
doBlockWithLock(file, {
Header header;
header.format = SomeFormat;
header.version = SomeVersion;
writeHeaderToFile(file, header);
writeSerializedData(file, data);
writeEndOfFile(file);
});
}
// Private
void doBlockWithLock(File file, Lambda block) {
file.holdWritingLock();
block();
file.releaseWritingLock();
}
}
Пример 2:
class Controller {
var screenOne = new ScreenOne();
var screenTwo = new ScreenTwo();
var screenThree = new ScreenThree();
void reloadButtonWasClicked() {
screenOne.reload();
screenTwo.reload();
screenThree.reload();
}
}
для этого я мог бы сделать что-то вроде этого:
var mockScreenOne = Mock<ScreenOne>().reload.expectOneCall();
var mockScreenTwo = Mock<ScreenTwo>().reload.expectOneCall();
var mockScreenThree = Mock<ScreenThree>().reload.expectOneCall();
Controller controller = new Controller();
controller.screenOne = mockScreenOne;
controller.screenTwo = mockScreenTwo;
controller.screenThree = mockScreenThree;
controller.reloadButtonWasClicked();
mockScreenOne.verify();
mockScreenTwo.verify();
mockScreenThree.verify();
Но я не находят в нем большую ценность, так как я просто утверждаю, что я делаю то же самое, что я делаю в реализации. Кажется, кодовое повторение ко мне.
Что было бы правильным способом тестирования моих 2 примеров?
Оставив в стороне последний пример, в первом, вы говорите, что не знаете, что будет делать writeSerializedData или другой метод? Что вы не представляете, какой файл FileFileCreator будет создан, возможно, потому, что эти методы являются частью другой кодовой базы или чего-то еще? –
Точно!У меня есть какая-то идея, и это «моя» база кода, у меня просто нет времени на жизнь, чтобы понять все это, если вы знаете, что я имею в виду ... –
Если бы я тестировал ее, я бы просто проверьте, что 'FileCreator.populateFileWithData' завершается без исключения исключения. Я также хотел бы проверить, существует ли целевой файл (поскольку он должен существовать), прежде чем я удалю свой временный тестовый файл. Для второго я бы проверял каждый экран, чтобы он реагировал соответствующим образом на перезагрузку; он заполнил материал, который предполагалось без ошибок. –