我理解cucumber
和capybara
是模仿用户操作来测试Web应用程序的。但是,如果我直接获取db记录以进行测试,是否有可能或建议是否有一些属性无法直接从Web界面查找?
如果是,如何找到当前测试用例创建的db记录?
答案 0 :(得分:1)
不推荐,但可以在功能测试中进行直接数据库访问测试。主要原因是功能测试旨在进行黑盒测试,从用户体验的角度测试应用程序中的特定功能(用户无法查看数据库,也不应该能够无论如何)。在这种情况下,即使对象的某些属性的值在UI中在技术上不可见,该属性在显示时也必须对记录产生一些影响(否则为什么首先具有该属性),并且该效果应该可以通过UI测试。
在极少数情况下,您确实需要进行直接数据库访问,您需要记住,您需要控制UI与测试数据库之间的同步。例如,以下测试代码将导致最好的片状测试。
...
click_button('Do something')
expect(page).to have_content('Something has been done') # UI check that will succeed when the triggered action has completed
expect(MyObject.last.some_attribute).to be true
...
这是因为一旦按下按钮,Capybara就不知道点击创建的任何进一步动作,只是返回。然后,在处理按钮点击生成的请求之前进行数据库访问,并且还没有记录,您正在针对错误的记录进行测试,或者记录的状态尚未更新,并且测试失败。要解决此问题,您需要在点击和数据库检查之间插入一个期望,以等待触发的操作完成
MyObject.last
至于如何识别所需的DB记录,您可以控制所有测试数据,并且应该为每个测试重置它。这样,如果您刚创建了一条记录,那么它应该是最后一条记录(my_test_object.reload...
)。如果您正在编辑记录,那么您在测试设置中创建了初始记录,并且应该可以访问它({{1}})等...