使用Smalltalk Seaside测试数据或等效测试数据?

时间:2013-04-27 20:41:56

标签: smalltalk pharo 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并不总是被调用,所以我可能会丢失我的真实数据。

我确实将数据保存到文件中,因此这不是一个大问题,但它并不像我希望的那样顺畅和自动化。

无论如何我可以改善这个吗?

2 个答案:

答案 0 :(得分:6)

我不确定是否存在可以完全解决问题的方案。真正的问题是该模型是全球性的。这很方便,但在这种情况下很容易失败。所以我会考虑将模型从全局变更为更本地化的变体,这样您就可以创建模型仅用于测试目的而不会干扰生产数据。

要在当前设置中修复它,您需要在某处添加ensure:block。确保阻止"确保"无论一切顺利还是发生错误,都会执行某些操作。问题是您需要在测试之前和之后进行。

在这种情况下,我会在你自己的测试类中覆盖TestCase>> #runCase,例如

runCase
   [ self saveRealModel.
      super runCase ]
      ensure: [ self restoreRealModel ]

答案 1 :(得分:2)

啊,这是一个很好的测试气味。 Norbert指出你的测试模型可能不是全局的,这是对的。大多数测试应该是关于单个对象之间的交互。 在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

这允许测试用例自身传递或单独(模拟)对象