Тестови приспособления или еквивалент за тестови данни с Smalltalk Seaside?

Използвах разработка, управлявана от тестове, в приложение на Seaside, с което си играх, и всичките ми данни се съхраняват като обекти в изображението (за разлика от база данни).

Така че, когато провеждам тестовете си, трябваше да внимавам да съхранявам истинските данни, преди да бъдат изхвърлени с тестови данни, като това:

ToDoTest>>setUp 
    savedTasks := Task tasklist.
    Task deleteAllTasks.

    savedProjects := ToDoProject projectlist.
    ToDoProject deleteAllProjects.

    savedPeople := Person peoplelist.
    Person deleteAllPeople.

И:

ToDoTest>>tearDown
    Task tasklist: savedTasks.
    ToDoProject projectlist: savedProjects.
    Person peoplelist: savedPeople

Проблемът идва, когато тестовете ми се провалят, което, разбира се, се случва, това изскача програмата за отстраняване на грешки и след това мога да поправя, но tearDown не винаги се извиква и така мога да загубя реалните си данни.

Записвам данните във файлове, така че не е голям проблем, но не е толкова гладко и автоматизирано, колкото бих искал да бъде.

Все пак мога ли да подобря това?


person Eric Clack    schedule 27.04.2013    source източник


Отговори (2)


Не съм сигурен дали има сценарий, който ще реши проблема напълно. Истинският проблем е, че моделът е глобален. Това е удобно и хубаво, но лесно се проваля в рамките на такъв сценарий. Така че бих обмислил промяна на модела от нещо глобално към по-локализиран вариант, така че да можете да създадете своя модел единствено с цел тестване, без да се намесвате в производствените данни.

За да го коригирате в рамките на текущата си настройка, трябва да добавите уверете се: блокирайте някъде. Блокът за осигуряване ви "гарантира", че нещо се изпълнява, независимо дали всичко е минало добре или е възникнала грешка. Проблемът е, че трябва да го направите преди и след тест.

В този случай бих презаписал TestCase>>#runCase във вашия собствен тестов клас с нещо подобно

runCase
   [ self saveRealModel.
      super runCase ]
      ensure: [ self restoreRealModel ]
person Norbert Hartl    schedule 29.04.2013
comment
интересно Мисля, че идеята за разделяне на данните по някакъв начин може да помогне тук. Например моето просто приложение за задачи в момента няма концепция за потребители, бих могъл да ги добавя и след това да създам тестов потребител за единичните тестове. - person Eric Clack; 30.04.2013
comment
Има много начини да го направите. Ако искате да локализирате данните си, лесният начин е да преместите нещата от страната на класа към страната на екземпляра. Ако ToDoProject е вашият основен клас, преместете страничните методи на класа към страната на екземпляра. Ще имате ToDoProject››#taskList, ToDoProject››#projectList,... В първата стъпка можете да направите ToDoProject сингълтон, така че ToDoProject class››#default да върне екземпляра ToDoProject с вашите реални данни. Вашият морски компонент ще има проект instVar. След това конфигурирате вашия компонент с ToDoProject по подразбиране за реална употреба и за тестване настройвате ToDoProject нов - person Norbert Hartl; 30.04.2013

А, това е хубава тестова миризма. Норбърт е прав като посочва, че вашият тестван модел вероятно не трябва да бъде глобален. Повечето тестове трябва да са върху взаимодействието между отделните обекти. В StoryBoard имаме потребители

DEUser subclass: #SBUser
    instanceVariableNames: 'email initials projects invitations'
    classVariableNames: ''
    poolDictionaries: ''
    category: 'StoryBoard-Data'

с потребители на instancevar на клас като входна точка. Проектите са достъпни само чрез потребителите.

users
    ^users ifNil: [ users := OrderedCollection with: (SBAdministrator new
        userid: 'admin';
        password: 'admin';
        yourself)
    ]

и начин да ги изчистите

resetUsers
    " SBUser resetUsers "
    users := nil

Често можем да предадем зависимости при създаване за обекти на домейн

Iteration>on: aProject
    ^self new
        project: aProject;
        yourself

Това позволява на тестовия случай да премине сам по себе си или отделен (макет) обект

person Stephan Eggermont    schedule 12.05.2013