Dav*_*ban 7 ruby rspec ruby-on-rails capybara capybara-webkit
我使用的是rails 4.0.5,rspec 2.14.1,capybara 2.2.1,capybara-webkit 1.1.0和database_cleaner 1.2.0.我通过以下功能测试看到一些奇怪的行为(模拟用户在帖子上查看评论,将鼠标悬停在图标上以显示菜单,然后单击菜单项以删除评论):
let(:user){create(:user)}
let(:post){create(:post, author: user)}
let!(:comment){create(:comment, post: post, author: user)}
...
it "can delete a comment" do
assert(page.has_css? "#comment-#{comment.id}")
find("#comment-#{comment.id}-controls").trigger(:mouseover)
find("#comment-#{comment.id} .comment-delete a").click
assert(page.has_no_css? "#comment-#{comment.id}")
end
Run Code Online (Sandbox Code Playgroud)
这个测试大约80%的时间都失败了,总是由于从数据库中检索到一些记录nil- 我得到的NoMethodError: undefined method X for nil:NilClass,对于X的各种值.有时nil是被删除的注释,有时它是注释附加的帖子到,有时它是评论/帖子的作者.
如果我添加sleep 1到测试结束,它会通过:
it "can delete its own comment" do
assert(page.has_css? "#comment-#{comment.id}")
find("#comment-#{comment.id}-controls").trigger(:mouseover)
find("#comment-#{comment.id} .comment-delete a").click
assert(page.has_no_css? "#comment-#{comment.id}")
sleep 1
end
Run Code Online (Sandbox Code Playgroud)
如果我放入sleep 1一个after区块,它也会通过.
知道为什么我得到这些NoMethodErrors,和/或为什么测试通过,如果我在完成所有工作后让它睡了一秒钟?
我怀疑在您从数据库中删除注释之前,您的应用程序中可能会从页面中消失(这是您断言的最后一件事).这意味着测试可以在删除发生之前进行清理.如果是这种情况,您可以通过等待在测试结束时发生实际删除来修复它.我有这种方法(重新实现从Capybara 2中删除但仍有时需要的方法)
def wait_until(delay = 1)
seconds_waited = 0
while ! yield && seconds_waited < Capybara.default_wait_time
sleep delay
seconds_waited += 1
end
raise "Waited for #{Capybara.default_wait_time} seconds but condition did not become true" unless yield
end
Run Code Online (Sandbox Code Playgroud)
所以我能做到
wait_until { Comment.count == 0 }
Run Code Online (Sandbox Code Playgroud)
在测试中.
另一种方法是添加Rack中间件,以阻止测试结束后发出的请求.这里详细描述了这种方法:http://www.salsify.com/blog/tearing-capybara-ajax-tests我看到它在一个大规模的RSpec特性规范中解决数据泄漏问题做得很好.
| 归档时间: |
|
| 查看次数: |
2037 次 |
| 最近记录: |