匹配运行匹配器时Rspec自定义失败消息错误

时间:2012-09-05 00:11:00

标签: ruby-on-rails rspec capybara

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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