使用rspec测试多步骤表单

时间:2014-01-09 21:11:24

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

我对Capybara和测试工具都不是很熟练。我正在构建一个多步骤表单或表单向导。

这就是我脑海中出现的情景:

  • 用户访问注册路径
  • 填写一堆无效数据,并显示一些验证错误
  • 填写有效数据,用户应该进入下一步
  • 使用有效数据重复此步骤n步骤
  • 检查用户数是否增加了1

这是我到目前为止所做的事情(我设法让事情变得有效):

describe "signup" do
  before { visit signup_path }
  let(:submit) { 'Start creating my account' }
  let(:next_btn) { 'Next' }

  describe "with invalid information" do
    it "should not create a user" do
        expect { click_button submit }.not_to change(User, :count)
    end

    describe "should not move to the next step" do
        before { click_button submit }
        it { should have_content('error') }
        it { should have_title('Start here') }
    end
  end

  describe "with valid information wizard step 1" do
    before do
        fill_in 'First name', with: "Example"
        fill_in 'Last name', with: "User"
        fill_in 'email', with: "user@example.com"
        find("#user_password").set "foobar"
    end

    it "should move to the next wizard step 2" do
        click_button submit
        should have_content('We need some more info')
    end
    it "should have error on the wizard step 2" do
        fill_in 'Date of birth', with: "Example"
        click_button next_btn
        should have_content('error')
    end
  end
end

这个断言失败了should have error on the wizard step 2,它似乎仍然停留在第1步,我知道这是通过查看页面内容和错误导致Dob element can't be foundnext button无法找到的

这是否可以通过水豚按顺序测试,逐步保存信息?

2 个答案:

答案 0 :(得分:4)

在进行后续步骤时,您应该能够通过嵌套describe块来完成这项工作,例如。

describe "signup" do
...

  describe "with valid information wizard step 1" do
    before do
      fill_in 'First name', with: "Example"
      fill_in 'Last name', with: "User"
      fill_in 'email', with: "user@example.com"
      find("#user_password").set "foobar"
      click_button submit
    end
    it "should move to the next wizard step 2" do
      should have_content('We need some more info')
    end

    describe "and filling out the date of birth incorrectly" do
      before do
        fill_in 'Date of birth', with: "Example"
        click_button next_btn
      end

      it "should have error on the wizard step 2" do
        should have_content('error')
      end
    end
  end
end

现在,嵌套块中会重复按钮单击,因此第一个示例单击“提交”,第二个示例单击“提交”,然后单击“next_btn”等。请记住,重复序列为< em>每个示例因此这可能会减慢您的测试速度。 OTOH它更准确地反映了用户的互动,因此权衡可能是值得的。

答案 1 :(得分:1)

我认为这不是一个水豚问题,而是一个rspec问题。我使用的黄瓜比rspec更多,但据我所知,在我有限的经验中,每个“描述”都是一个独立的测试用例。我不认为你可以。期望这些以任何特定顺序执行或b。在测试之间共享上下文/状态。

同样,我的经验主要是黄瓜,但我之前已经为这个EXACT场景编写了测试 - 两页用户注册向导。在黄瓜中,人们编写“场景”,这些场景基本上都是用“给定”,“何时”和“然后”(或者更糟糕的是,假设,动作和断言)来描述用户与系统交互的短篇小说。 )这些是用简单的英文写的。然后,编写将这些英语句子映射到Ruby代码(可能使用capybara)的Ruby代码来执行/测试每个场景描述的内容......我所做的是构建了几个不同的场景。

  1. 用户访问注册页面;用一大堆错误填写它;检查系统是否显示错误
  2. 用户访问注册页面;填写正确;检查用户是否进入第二页
  3. 用户已完成第一页;用一大堆错误填写第二页;检查系统是否显示错误
  4. 用户已完成第一页;正确填写第二页;检查用户是否进入确认页面
  5. 您显然可以将这些故事翻译成rspec。

    在这些场景中重现的是两种形式的填写(无论是好的还是坏的数据)。要保持代码DRY,请创建一些辅助方法,使您可以使用可帮助您满足每个方案的值轻松填充表单。

    这对你有帮助吗?