在我的'通知'模型中,我有一个方法(通知和联系模型都有并且属于许多):
`def self.update_contact_association(contact, notification)
unless contact == nil
notification.contacts.clear
c = Contact.find(contact)
notification.contacts << c
end
end`
更新特定通知和联系人之间的关联。它需要一个通知对象(行)和一个联系人ID列表。该方法工作正常,给定一个联系人ID 1和一个id为4的通知更新表应该如下:
notification_id contact_id
4 1
在尝试编写单元测试以正确测试此方法时会出现问题。到目前为止,我有:
'test 'update_contact_association' do
notification = Notification.find(4)
contact = Contact.find(1)
Notification.update_contact_association([contact.id], notification)
'end
运行测试方法不会导致错误,但测试数据库不会更新为上面的示例,它只是空白。我很确定我需要使用保存或更新方法来模仿控制器正在做什么,但我不确定如何。我只需要单元测试来正确更新表,这样我就可以继续编写我的断言。任何想法都会非常感激,因为我需要测试几种与此非常相似/相同的方法。
答案 0 :(得分:0)
测试通常会在事务内部运行任何数据库查询,并在完成每个测试后回滚该事务。当测试完成时,这将导致数据库为空。
这是为了确保每个测试的原始起点,并且测试不是相互依赖的。单元测试应该是隔离运行的,因此它应该始终从相同的数据库/环境状态开始。它还可以在尽可能少的代码上运行,因此您不必担心代码交互(还有!)。
当您准备担心代码交互时,您将需要构建集成测试。它们更长,并且将触及多个代码区域,运行每个不同的可能输入组合,因此尽可能多地触摸代码行(这就是代码覆盖的全部内容)。
所以,它是空白的事实是正常的。运行update_contact_association
方法后,您需要声明一些条件。这将向您显示数据库处于预期状态,并且该方法的结果是您期望的结果。