匹配中多个期望语句的自定义断言消息 [英] Custom assert message for multiple expect statements within match

查看:36
本文介绍了匹配中多个期望语句的自定义断言消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 Rspec 中编写了一个自定义匹配方法,该方法将对象与哈希进行匹配.我想要做的是为 expect 的每一行设置自定义失败消息.

I have written a custom match method in Rspec that matches an object against a hash. What I am trying to do is set custom failure messages for each line of the expect.

describe "/cars" do
  car = FactoryGirl.create(:car, name: 'Alpha')
  describe car do
    it "displays single items" do
      get cars_path
      parsed_response = JSON.parse(response.body)
      record_hash = parsed_response['cars'][0]
      is_expected.to be_a_car_match_of(record_hash)
    end
  end
end

RSpec::Matchers.define :be_a_car_match_of do |hash|
  match do |car|
    expect(car.id).to    eq(hash['id'])
    expect(car.name).to  eq(hash['name'])
  end
  failure_message do |car|
    "expected that #{car} would be a match of #{hash}"
  end
end

所以我想要的是如下内容:

So what I would like is to have something like the following:

RSpec::Matchers.define :be_a_car_match_of do |hash|
  match do |car|
    expect(car.id).to    eq(hash['id'])    'ids did not match'
    expect(car.name).to  eq(hash['name'])  'names did not match'
  end
end

这会打印出更清晰的错误消息.

This would print out a much clearer error message.

我最初是在小型测试中这样做的,但出于各种原因(我无法控制)需要将其更改为 rspec.我在小测试中的代码是:

I was initially doing this in mini-test but for a variety of reasons (outside of my control) needed to change it to rspec. The code I had in mini-test was:

def assert_car(car, hash)
    assert_equal car.id,    hash['id'],   "ids did not match"
    assert_equal car.name,  hash['name'], "names did not match"
end

这就是我想要复制的.

这是另一个需要较少设置的示例:

Here is another example that requires less setup:

require 'rspec/expectations'

RSpec::Matchers.define :be_testing do |expected|
  match do |actual|
    expect(5).to eq(5)
    expect(4).to eq(5)
  end
  failure_message do
    "FAIL"
  end
end

describe 'something' do
  it 'something else' do
    expect("expected").to be_testing('actual')
  end
end

当这个例子运行时,打印出FAIL".另一方面,如果我有:

When this example is run, "FAIL" is printed out. On the other hand if I had:

describe 'something' do
  it 'something else' do
    expect(4).to eq(5)
  end
end

我会收到以下错误消息:

I would get the following error message:

expected: 5
     got: 4

这就是我想要的.我想知道自定义匹配器的哪一部分失败了.

This is what I want. I want to know what part of the custom matcher failed.

推荐答案

您可以调用低级 matches? 方法而不是 expect.像这样:

You could call the low-level matches? method instead of expect. Something like this:

require 'rspec/expectations'

RSpec::Matchers.define :be_a_positive_integer do

  m1, m2 = nil, nil           # matchers
  r1, r2 = false, false       # results

  match do |actual|
    m1 = be_a Integer         # this returns matcher instances
    m2 = be > 0

    r1 = m1.matches?(actual)  # evaluate matchers
    r2 = m2.matches?(actual)

    r1 && r2                  # true if both are true
  end

  failure_message do |actual| # collect error messages from matchers
    messages = []
    messages << m1.failure_message unless r1
    messages << m2.failure_message unless r2
    messages.join("\n")
  end

end

describe -1 do
  it { is_expected.to be_a_positive_integer }
end

describe 1.0 do
  it { is_expected.to be_a_positive_integer }
end

describe -1.0 do
  it { is_expected.to be_a_positive_integer }
end

输出:

Failures:

  1) -1 should be a positive integer
     Failure/Error: it { is_expected.to be_a_positive_integer }
       expected: > 0
            got:   -1
     # ./ruby_spec.rb:24:in `block (2 levels) in <top (required)>'

  2) 1.0 should be a positive integer
     Failure/Error: it { is_expected.to be_a_positive_integer }
       expected 1.0 to be a kind of Integer
     # ./ruby_spec.rb:28:in `block (2 levels) in <top (required)>'

  3) -1.0 should be a positive integer
     Failure/Error: it { is_expected.to be_a_positive_integer }
       expected -1.0 to be a kind of Integer
       expected: > 0
            got:   -1.0
     # ./ruby_spec.rb:32:in `block (2 levels) in <top (required)

这篇关于匹配中多个期望语句的自定义断言消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆