我对黄瓜很新。我正在尝试编写测试以确保用户不会创建重复的标记。所以编写了一个功能,内容如下:
Scenario: Analyst adds a duplicate privacy tag
Given I have a privacy tag called "Green"
When I try to create a tag called "Green"
Then I should be on the new privacy tag page
And I should see an error message for "Green"
我的步骤就这样定义了:
Given /^I have a privacy tag called "(.*?)"$/ do |tag|
PrivacyTag.create(:content => tag)
end
When /^I try to create a tag called "(.*?)"$/ do |arg1|
visit new_privacy_tag_path
fill_in 'privacy_tag[content]', :with => arg1
click_button 'Create'
end
Then /^I should be on the new privacy tag page$/ do
new_privacy_tag_path
end
Then /^I should see an error message for "(.*?)"$/ do |arg1|
page.should have_selector('div', :class => 'alert alert-error') do |flash|
flash.should have_content fartknocker
end
end
所以奇怪的是,所有这些测试现在正在通过。当您尝试创建重复的隐私标记时,应用程序允许它,并且您最终在隐私标记索引页面上,用户不会返回到new_privacy_tag_path。但测试仍然通过。而Cucumber甚至没有眨眼,因为没有任何变量被定义为fartknocker并且fartknocker这个词在任何地方都没有出现在页面上。测试仍然通过。是什么给了什么?
答案 0 :(得分:0)
那是因为page.should have_selector
没有阻止。您可能正在寻找的是within
方法:
page.within('div', :class => 'alert alert-error') do
page.should have_content fartknocker
end
编辑:
因为在你的代码中,行flash.should have_content fartknocker
位于一个永远无法运行的块中,所以Ruby从不对它进行评估,所以没有机会抱怨丢失的变量。
答案 1 :(得分:0)
Then /^I should be on the new privacy tag page$/ do
new_privacy_tag_path
end
这并没有断言任何东西。所以它永远是绿色的。
Then /^I should see an error message for "(.*?)"$/ do |arg1|
page.should have_selector('div', :class => 'alert alert-error') do |flash|
flash.should have_content fartknocker
end
end
另外,您必须小心have_content
/matches/
vs "equals"
。 Jon M在他的回答中提到的是你需要解决的问题。