0

我正在使用 Steak 进行验收测试,因为我根本不喜欢 Cucumber,尽管我在测试的方式中使用了一些 Cucumber 概念。我喜欢声明式和命令式的测试风格,我将一些期望抽象到精心设计的自定义 rspec 匹配器中,这些匹配器在 match 方法中使用其他匹配器,这里有一个例子:

RSpec::Matchers.define :show_post do |post|
  match do |page|
    within '.post' do
      page.should have_content post.title
      page.should have_content post.tagline
      page.should have_content post.body
      page.should list_author  post.author
    end
  end
end

我遇到的唯一问题是,如果我的匹配器失败,我会收到一条通用消息,它不会让我了解丢失的内容,而我真正想要的是现在不满足构成自定义匹配器的期望之一.

我已经忍受这种麻烦有一段时间了,因为我真的很喜欢能够做到的表现力:

page.should show_post Post.last
4

2 回答 2

0

知道了:

class ShowsPost
  include Capybara::RSpecMatchers

  def initialize post
    @post = post
  end

  def matches? page
    page.should have_content @post.title
    page.should have_content @post.tagline
    page.should have_content @post.body
    page.should list_author  @post.author
  end
end

def show_post post
  ShowsPost.new(post)
end
于 2012-09-05T00:55:23.533 回答
0

更好的是:

module DefineMatcher
  def define_matcher name, &block
    klass = Class.new do
      include Capybara::RSpecMatchers

      attr_reader :expected

      def initialize expected
        @expected = expected
      end

      define_method :matches?, &block
    end

    define_method name do |expected|
      klass.new expected
    end
  end
end


module PageMatchers
  extend DefineMatcher

  define_matcher :show_notice do |page|
    within '.alert-notice' do
      page.should have_content expected
    end
  end
end

RSpec.configuration.include PageMatchers, :type => :acceptance
于 2013-01-25T04:22:51.407 回答