gpt4 book ai didi

ruby - 匹配中多个期望语句的自定义断言消息

转载 作者:数据小太阳 更新时间:2023-10-29 07:35:59 24 4
gpt4 key购买 nike

我在 Rspec 中编写了一个自定义匹配方法,用于将对象与哈希匹配。我想要做的是为 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

所以我想要的是像下面这样的东西:

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

这将打印出更清晰的错误消息。

我最初是在迷你测试中这样做的,但出于各种原因(超出我的控制范围)需要将其更改为 rspec。我在迷你测试中的代码是:

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

这就是我要复制的内容。

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

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”。另一方面,如果我有:

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

我会收到以下错误消息:

expected: 5
got: 4

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

最佳答案

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

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)

关于ruby - 匹配中多个期望语句的自定义断言消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24664034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com