对于黄瓜情景的简洁和实用,我印象深刻,它们是测试不同情况的好方法.
例如例如黄瓜情景
Feature: Manage Users In order to manage user details As a security enthusiast I want to edit user profiles only when authorized Scenario Outline: Show or hide edit profile link Given the following user records | username | password | admin | | bob | secret | false | | admin | secret | true | Given I am logged in as "<login>" with password "secret" When I visit profile for "<profile>" Then I should <action> Examples: | login | profile | action | | admin | bob | see "Edit Profile" | | bob | bob | see "Edit Profile" | | | bob | not see "Edit Profile" | | bob | admin | not see "Edit Profile" |
(代码取自Ryan Bates’ More on Cucumber Screencast)
RSpec有相当的等级吗?
我想在RSpec中做同样的事情,并通过在场景表中将不同的测试减少到一行来减少我的代码.
虽然我可以自己编写代码,但我正在考虑的事实让我想知道两件事情
>如果这是有用的,它可能已经存在,在哪种情况下如何使用它?
>如果不存在,它表明不应该这样做,而且我不正确地接近问题,我应该如何反思我的RSPec方法?
哪个答案是正确的,如果它是有用的,我该如何做?
解决方法
尝试以下方法.我喜欢原来的方式.
describe StateDateMethods do before :each do @product = OpenStruct.new @product.extend StateDateMethods end def parse_date(unparsed_date_value) unless unparsed_date_value.nil? DateTime.strptime(unparsed_date_value,'%m/%d/%Y') end end context '#pre_order?' do examples = [ # [visible_on,pre_order_on,for_sale_on] => method_result { :inputs => [nil,nil,nil],:expected => false },{ :inputs => ['1/1/2001','1/1/2001',:expected => true },'1/2/2001','1/2/2001'],'1/1/3001'],'1/1/3001','1/2/3001'],{ :inputs => ['1/1/3001','1/1/2001'],:expected => false } ] examples.each do |example| inputs = example[:inputs] it "should return #{example[:expected].inspect} when visible_on == #{inputs[0].inspect},pre_order_on == #{inputs[1].inspect},for_sale_on == #{inputs[2].inspect}" do @product.visible_on = parse_date(inputs[0]) @product.pre_order_on = parse_date(inputs[1]) @product.for_sale_on = parse_date(inputs[2]) @product.pre_order?.should == example[:expected] end end end end
我认为这给了两个世界最好的,因为它让我不再重复,并且为每个条件创建了一个不同的测试.
这是一个失败的样子:
....F..... Failures: 1) StateDateMethods#pre_order? should return false when visible_on == "1/1/2001",pre_order_on == "1/1/2001",for_sale_on == "1/2/2001" Failure/Error: @product.pre_order?.should == example[:expected] expected: false got: true (using ==) # ./spec_no_rails/state_date_methods_spec.rb:40:in `block (4 levels) in <top (required)>' Finished in 0.38933 seconds 10 examples,1 failure Failed examples: rspec ./spec_no_rails/state_date_methods_spec.rb:35 # StateDateMethods#pre_order? should return false when visible_on == "1/1/2001",for_sale_on == "1/2/2001"
这就是所有绿色的样子:
.......... Finished in 0.3889 seconds 10 examples,0 failures