我有了一个多形式/向导界面,单页西纳特拉的应用程序。 如果我想测试与水豚的形式,就需要重复每个测试的所有步骤? 我希望能避免这样的:
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工作。
我做了一些研究你,我会跟你分享我所发现的。
为了做这个,你应该考虑“转换”你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: { ... } }
用这种方法很容易看到params
是post
编辑,因此它更容易测试针对如。 违反任何规则(空值,无效的电子邮件等)。
希望帮助! 祝好运!