使用Rspec / Capybara进行RSpec测试。
假设我们有PostsController和基本的CRUD。
测试什么?
创建新帖子(#new),显示所有帖子(#index),销毁帖子(#destroy)等,如下面的代码或其他方式:It allows user to create new post; when posts doesnt't exist it renders 404 ...; when user is blocked render 403
?
require 'spec_helper'
feature 'Post management', js: true do
background { login_user }
given!(:project) { create(:project) }
scenario 'creating new post' do
expect do
visit new_project_post_path(project)
fill_in 'post_title', with: 'Hello, I am the Doctor'
fill_in 'post_text', with: 'Trust me.'
click_button 'Add post'
end.to change(Post, :count).by(1)
end
given!(:project) { create(:project_with_posts) }
scenario 'listing posts' do
visit project_posts_path(project)
project.posts.each do |post|
page.should have_content post.title
end
end
given!(:post) { create(:post) }
scenario 'showing posts' do
visit project_post_path(post.project, post)
page.should have_content post.title
page.should have_content post.text
end
end
答案 0 :(得分:3)
这只能是一个自以为是的答案,但这是我关于验收测试的经验法则:
这就是,正如您提到的“接受”测试:stackholder希望为功能提供通常的行为,不要担心如果某些内容无效或用户忘记登录会发生什么(控制器规格已经测试过)。
这不是检查数据库是否处于正确状态的地方。测试Flash消息以及页面中可视化更改的内容(列表中的项目是否已经存在)。
例如,在“创建新帖子”场景中,您可以测试:
within '#flash_message' do
page.should have_content 'Post created'
end
within '#posts' do
page.should have_content "My new post"
end
您可以编写更多细节,但它会与单元测试重复,这会更快(如果您可以检查Post接收到#create
存根的调用,为什么要检查Post.count是否为+1?)。在页面上测试一些文本或元素就足以说明部分可以很好地协作。
没有用户“访问待办事项列表项目版本页面”。它们从主页开始,然后转到待办事项列表,然后单击特定项目行上的“编辑”。
在您的代码中,您可以替换:
visit project_posts_path(project)
with:
def visit_posts
visit '/'
within '#projects' do
first( 'a.posts' ).click
end
end
scenario 'listing posts' do
visit_posts
project.posts.each do |post|
page.should have_content post.title
end
end
运行时间较长,但无论如何,在存在一两年之后,您的验收测试套件将太长而无法等待它,您将把它放在一个持续集成服务器上。这里重要的是测试一切按预期工作,而不是特定的行为。没有比开始使用主页(或实际用户可以直接打开的任何页面,例如管理主页)更好的方法。