黄瓜测试通过,他们不应该通过

时间:2012-08-29 16:49:42

标签: ruby-on-rails tdd cucumber

我对黄瓜很新。我正在尝试编写测试以确保用户不会创建重复的标记。所以编写了一个功能,内容如下:

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这个词在任何地方都没有出现在页面上。测试仍然通过。是什么给了什么?

2 个答案:

答案 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在他的回答中提到的是你需要解决的问题。