2015-04-16 3 views
3

Мне легко писать модульные тесты для алгоритмов. Например, 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 примеров?

+0

Оставив в стороне последний пример, в первом, вы говорите, что не знаете, что будет делать writeSerializedData или другой метод? Что вы не представляете, какой файл FileFileCreator будет создан, возможно, потому, что эти методы являются частью другой кодовой базы или чего-то еще? –

+0

Точно!У меня есть какая-то идея, и это «моя» база кода, у меня просто нет времени на жизнь, чтобы понять все это, если вы знаете, что я имею в виду ... –

+0

Если бы я тестировал ее, я бы просто проверьте, что 'FileCreator.populateFileWithData' завершается без исключения исключения. Я также хотел бы проверить, существует ли целевой файл (поскольку он должен существовать), прежде чем я удалю свой временный тестовый файл. Для второго я бы проверял каждый экран, чтобы он реагировал соответствующим образом на перезагрузку; он заполнил материал, который предполагалось без ошибок. –

ответ

0

В первом примере, если вы написали сообщения, о которых идет речь, и удовлетворены тестовым покрытием, нет причин воспроизводить эту логику тестирования в FileCreator. Вам просто нужно протестировать метод FileCreator populateFileWithData, чтобы убедиться, что файл написан и, возможно, работает механизм блокировки.

Вы правы, ваш последний тест довольно тривиален. У меня возникло бы желание отказаться от написания. Но это зависит. Возможно ли, что кто-то может прийти и закомментировать один из этих панельных конструкторов? Есть ли у вас другие тесты, которые бы выявили такую ​​проблему?

+0

Сходство между ними заключается в том, что у них обоих нет логики. 1) Предположим, что эти 3 метода уже протестированы и не являются моими. Если у меня нет доступа к функции десериализации, как бы я ее протестировал? Кроме того, предположим, что я являюсь тем, кто создает функцию десериализации, поэтому это отдельная логика, которую я не хочу реплицировать в своих модульных тестах для метода populateFileWithData. 2) Опустив, вы имеете в виду, что не тестируете его? –

Смежные вопросы