在验收规范中测试或不测试的内容是什么?

时间:2013-09-25 14:00:28

标签: ruby-on-rails rspec capybara acceptance-testing

使用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

1 个答案:

答案 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

运行时间较长,但无论如何,在存在一两年之后,您的验收测试套件将太长而无法等待它,您将把它放在一个持续集成服务器上。这里重要的是测试一切按预期工作,而不是特定的行为。没有比开始使用主页(或实际用户可以直接打开的任何页面,例如管理主页)更好的方法。