Rails 3.2拥有并且属于许多更新关联单元测试

时间:2013-09-10 00:11:20

标签: ruby-on-rails unit-testing activerecord ruby-on-rails-3.2 associations

在我的'通知'模型中,我有一个方法(通知和联系模型都有并且属于许多):

`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

运行测试方法不会导致错误,但测试数据库不会更新为上面的示例,它只是空白。我很确定我需要使用保存或更新方法来模仿控制器正在做什么,但我不确定如何。我只需要单元测试来正确更新表,这样我就可以继续编写我的断言。任何想法都会非常感激,因为我需要测试几种与此非常相似/相同的方法。

1 个答案:

答案 0 :(得分:0)

测试通常会在事务内部运行任何数据库查询,并在完成每个测试后回滚该事务。当测试完成时,这将导致数据库为空。

这是为了确保每个测试的原始起点,并且测试不是相互依赖的。单元测试应该是隔离运行的,因此它应该始终从相同的数据库/环境状态开始。它还可以在尽可能少的代码上运行,因此您不必担心代码交互(还有!)。

当您准备担心代码交互时,您将需要构建集成测试。它们更长,并且将触及多个代码区域,运行每个不同的可能输入组合,因此尽可能多地触摸代码行(这就是代码覆盖的全部内容)。

所以,它是空白的事实是正常的。运行update_contact_association方法后,您需要声明一些条件。这将向您显示数据库处于预期状态,并且该方法的结果是您期望的结果。