BDD:我在使用Devise时应该如何测试身份验证?

时间:2013-09-29 18:50:11

标签: ruby-on-rails rspec devise tdd bdd

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

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

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

另一方面是不正确的,也没用来测试其他代码。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

按照此处的说明安装capybara 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

这些对于确保您对各个页面的任何限制都是正确的特别有用。您可以通过测试用户登录或角色错误等情况来测试此行为。

答案 1 :(得分:0)

我想出了以下几点:

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

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