0

你编写测试,让它们失败,然后编写代码让它们通过。简单...直到您决定使用gem代替您的代码。例如,设计。

我真的不知道我应该写什么集成(又名请求或功能)规范。

如果我不写任何东西,我必须打开浏览器来检查 gem 与应用程序的集成是否正常,这很糟糕(cfr. Ryan Bates)。另外,我可能会错误地破坏功能。

另一方面是不正确且无用的测试其他代码。

什么是正确的平衡?添加设计时如何执行 BDD(使用 RSpec)?

非常感谢您在使用 Devise 时编写的作为授权测试的具体示例。

如果您的应用程序中有自定义设计视图,您将如何回答相同的问题?

4

2 回答 2

2

您绝对可以使用 Capybara 和 Rspec 实现这一目标。

按照此处的说明安装水豚https://github.com/jnicklas/capybara#using-capybara-with-rspec - 提示,确保命名您指定的目录features

然后只需使用 capybara 来测试驱动您的应用程序

所以为了测试你的注册这个例子应该可以工作,显然你需要根据你的应用程序调整参数和路由。

require 'spec_helper'

feature 'Signing up' do
  scenario 'creates a new user' do
    visit '/users/sign_up'
    password = 'samplepassword'
    fill_in 'First name', with: 'Testy'
    fill_in 'Last name', with: 'McTester'
    fill_in 'Email', with: 'testy@example.com'
    fill_in 'Password', with: password
    fill_in 'Password confirmation', with: password
    click_link 'Sign up'
    expect(page).to have_content 'You have signed up successfully'
  end
end

Devise 还具有测试助手,您可以在测试应用程序的其他区域时使用它们https://github.com/plataformatec/devise#test-helpers

这些对于确保您在各个页面上放置的任何限制都是正确的特别有用。您可以通过测试如果用户登录或具有错误角色等会发生什么来测试此行为。

于 2013-09-30T01:22:21.093 回答
0

我想出了以下几点思考:

  • 语义上的原因是高级测试(例如使用 Capybara 的 RSpec)意味着您正在描述站点的功能,并且身份验证仍然是一项功能,即使您使用 gem
  • 一个实际的原因是,如果我不添加测试,我肯定必须通过浏览器测试身份验证
  • 假设您决定删除 gem 并从头开始重写身份验证;这是重构,因为测试应该允许重构而不需要更改它们,还有另一个从一开始就添加高级测试的原因(即使您将使用 gem)
  • 如果您在另一个抽象级别上进行测试,那么您测试已经测试过的代码并不是必须的:例如,功能测试和集成测试总是与单元测试部分重叠
  • 您没有对相同的东西进行双重测试,因为您正在测试 gem 与您的网站的集成,而这不可能已经在 gem 内部测试过

恕我直言,总之有更多的理由来测试,而不是不测试,基于第三方宝石的身份验证系统。

于 2013-10-02T13:40:31.613 回答