【发布时间】:2014-03-01 23:45:16
【问题描述】:
我正在使用 rspec 和 capybara 为我的 Rails 4 应用程序编写一些功能测试。我让它正常工作,但我很难理解以这种方式进行测试的某些方面。
我一直在读到每个测试(它“应该......”阻止)应该只测试一件事。好的,这听起来不错,但是当我将其付诸实践时,我最终会为简单的事情编写大量测试。
假设我有一个标准的注册表单,其中包含电子邮件、密码和信用卡。
所以 test 为我的注册编写一个功能测试,我是否必须编写 3 个单独的测试来测试该功能?
describe "Signup" do
it "informs user of an invalid email" do
visit signups_path
fill_in "Email", with: ""
click_button "Signup"
expect(page).to have_text("Email can't be blank")
end
it "informs user of an invalid password" do
visit signups_path
fill_in "Email", with: "test@test.com"
fill_in "Password", with: ""
click_button "Signup"
expect(page).to have_text("Password can't be blank")
end
it "informs user of an invalid credit card" do
visit signups_path
fill_in "Email", with: "test@test.com"
fill_in "Password", with: "valid-password"
fill_in "Card", with: "bogus"
click_button "Signup"
expect(page).to have_text("Card is invalid")
end
end
在一次测试中测试所有这些似乎更简单。我正在努力寻找有关执行功能测试的正确方法的文章。我不想开始随机编写测试(1)实际上并没有覆盖/测试我的代码或(2)变得臃肿和缓慢,因为我没有能力编写它们。我了解测试的必要性,只是不确定如何最好地进行上述功能测试。
【问题讨论】:
-
为什么你觉得写一个测试会更简单?
-
@JustinKo,我认为这会更简单,因为对于每个测试,我都处于相同的“场景”中,每个测试都有很多重复的代码。不过,在研究了一段时间后,我得出结论,清理
before块中的重复代码很有帮助,真正的测试应该只有 1 个expect/assert才能真正帮助查明问题。 “更简单”我想我的意思是“更短”。但有时更短并不总是更好。
标签: rspec tdd capybara integration-testing