ruby-on-rails – 在RSpec中有一个等同于Cucumber的“场景”,还是使用RSpec错误的方式?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在RSpec中有一个等同于Cucumber的“场景”,还是使用RSpec错误的方式?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对于黄瓜情景的简洁和实用,我印象深刻,它们是测试不同情况的好方法.

例如例如黄瓜情景

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

猜你在找的Ruby相关文章