-->

如何测试与水豚和MINITEST多步的形式?(How can I test multistep fo

2019-10-22 03:54发布

我有了一个多形式/向导界面,单页西纳特拉的应用程序。 如果我想测试与水豚的形式,就需要重复每个测试的所有步骤? 我希望能避免这样的:

it "visits the home page" do 
  vist "/"
  page.should have_content('foo')
end

it "clicks the first button" do 
  vist "/"
  page.should have_content('foo')
  button_click("Next")
end

it "clicks the second button" do 
  vist "/"
  page.should have_content('foo')
  button_click("Next")
  page.should_have_content('bar')
end

it "clicks the third button" do 
  vist "/"
  page.should have_content('foo')
  button_click("Next")
  page.should_have_content('bar')
  button_click("Next")
end

我发现了有关项目的使用RSpec的和水豚嵌套的测试 ,但一直没能得到类似的技术与MINITEST工作。

Answer 1:

我做了一些研究你,我会跟你分享我所发现的。

为了做这个,你应该考虑“转换”你Minitest测试,对规范 。 这为您提供了类似的语法访问, RSpec的- describe与嵌套他们的能力。

我将简化代码提供的例子,但它应该是清楚的在那里把你的逻辑。

让我们来看看几个例子。

1)。 让我们做一些简单的测试Array

require "minitest/autorun"

describe Array do
  before do
    @arr = []
  end

  describe "when initialized" do
    it "is empty" do
      @arr.length.must_equal 0
    end
  end
end

这应该传球,什么真正看中这里。

2)。 让我们添加另外describe ,嵌套一个我们有:

describe Array do
  before do
    @arr = []
  end

  describe "when initialized" do
    it "is empty" do
      @arr.length.must_equal 0
    end

    describe "when element added" do
      it "length reflects the change" do
        @arr << "a"
        @arr.length.must_equal 1
      end
    end
  end
end

这也适用-一个元素被添加到阵列中,并且其length指示正常。

3)。 让我们尝试嵌套另一个块。 我们希望,这@arr << "a"将被保留,所以如果我们添加其他元素, @arr.length为2。让我们来看看:

describe Array do
  before do
    @arr = []
  end

  describe "when initialized" do
    it "is empty" do
      @arr.length.must_equal 0
    end

    describe "when element added" do
      it "length reflects the change" do
        @arr << "a"
        @arr.length.must_equal 1
      end

      describe "when another element added" do
        it "length also reflects the change" do
          @arr << "b"
          p @arr
          @arr.length.must_equal 2
        end
      end
    end
  end
end

describe嵌套在另一个describe - 因为我们会为RSpec的做 ,但遗憾的是,似乎结果@arr << "a"不保留,并嵌套describe@arr.length也为1。

我已经离开p @arr中的代码,这样你就可以在控制台什么是目前保存在容易看到@arr

绝对不是我们所期望的......让我们尝试一些疯狂 ,然后...

4)。 让我们窝describe中...... it

describe Array do
  before do
    @arr = []
  end

  describe "when initialized" do
    it "is empty" do
      @arr.length.must_equal 0
    end

    describe "when element added" do
      it "length reflects the change" do
        @arr << "a"
        @arr.length.must_equal 1

        describe "when another element added" do
          it "length also reflects the change" do
            @arr << "b"
            p @arr
            @arr.length.must_equal 2
          end
        end
      end
    end
  end
end

那么,事实证明,这是完全有效的,它的行为完全如我们所料! (同样, p @arr离开这里,所以你在控制台检查什么是当前存储在@arr )。

说实话-我没有检查与Capybara ,但这个简单的例子还是比较看好的。 尝试相应地修改你的代码,所以在您的规格的Capybara互动中实现的。

让我讲清楚提供的解决方案: 我强烈建议agains这种方法:

  • 这样的规格难以阅读 - 在结果 - 难以维持。
  • 这被认为是错误的思路。 下一步 不应该依赖于前面的步骤的结果。

如果你要正确地测试位指示,你应该尝试与此类似(这是伪代码只是为了说明想法):

试验第1步

post "/url-to-my-form", { params_step_1: { ... } }

测试步骤2

post "/url-to-my-form", { params_step_1: { ... }, params_step_2: { ... } }

用这种方法很容易看到paramspost编辑,因此它更容易测试针对如。 违反任何规则(空值,无效的电子邮件等)。

希望帮助! 祝好运!



文章来源: How can I test multistep forms with Capybara & Minitest?