我一直在使用我正在玩的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并不总是被调用,所以我可能会丢失我的真实数据。
我确实将数据保存到文件中,因此这不是一个大问题,但它并不像我希望的那样顺畅和自动化。
无论如何我可以改善这个吗?
答案 0 :(得分:6)
我不确定是否存在可以完全解决问题的方案。真正的问题是该模型是全球性的。这很方便,但在这种情况下很容易失败。所以我会考虑将模型从全局变更为更本地化的变体,这样您就可以创建模型仅用于测试目的而不会干扰生产数据。
要在当前设置中修复它,您需要在某处添加ensure:block。确保阻止"确保"无论一切顺利还是发生错误,都会执行某些操作。问题是您需要在测试之前和之后进行。
在这种情况下,我会在你自己的测试类中覆盖TestCase>> #runCase,例如
runCase
[ self saveRealModel.
super runCase ]
ensure: [ self restoreRealModel ]
答案 1 :(得分:2)
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
这允许测试用例自身传递或单独(模拟)对象