2011-02-01 91 views
5

我们想测试我们对黄瓜的步骤定义。我们希望能够检查的一件事是,我们预计失败的测试实际上会失败。为此,我们希望编写我们知道会失败的场景,并将它们添加到我们的测试套件中,但标记或以其他方式表示它们,以便当且仅当它们失败时才“通过”。如何解决这个问题?如何期待黄瓜失败的步骤和传递失败?

回答

0

您应该测试否定状态。一个失败的步骤只是一个传递步骤的逆转。所以做类似的事情:

Then /i should not be true/ do 
    some_value.should_not be_true 
end 

这就是我将如何去测试失败。您还可以赶上异常和等,并验证块事实上确实抛出该异常

lambda do 
    something_that_horks 
end.should raise_error(Specific::Error) 

你根本扭转你的测试用例的测试,以测试为阴性结果,而不是阳性结果。

+0

这里的目的不是为了测试状态不正确,则是在状态不正确时测试测试失败。换句话说,我们正在测试我们的步骤,而不是测试状态。 – kerkeslager 2011-02-03 16:57:35

-1

您将-w开关切换到Cucumber命令。

它会输出正常的格式,但最后它会给出一个总结,详细说明所有测试用例是否失败,如果有任何通过它将指定哪些。

0

这是一个非常复杂的例子,但最终结果是一个非常干净的方法,期望黄瓜场景失败。这些只是我正在开发的一个项目中的一小部分组件。创建缺少数据的用户失败的原因是因为我的用户模型中有一些验证器。所有的源代码可以找到here

功能/ step_definitions/before_step.rb

Before("[email protected]") do 
    def assert_cucumber(assersion, msg = "an error was thrown") 
    assert(assersion == true, msg) 
    end 
end 

Before("@fails") do 
    def assert_cucumber(assersion, msg = "an error was thrown") 
    assert(assersion == false, msg) 
    end 
end 

功能/ step_definitions/user_step.rb

Given /^a user with$/ do |params| 
    params = params.rows_hash 
    unless User.find_by({username: params[:username]}) 
    assert_cucumber(User.new(params).save, "could not create user") 
    end 
end 

功能/ user.feature

Scenario: check if userers exsist 
    Given a user with 
    | username | johnsmith    | 
    | email | [email protected] | 
    | password | password    | 
    Then a user with username "johnsmith" 

@fails 
Scenario: create user with missing data 
    Given a user with 
    | username | johndoe | 
    Then a user with username "johndoe"