我正在使用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
答案 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