我在RSpec中有一个自定义匹配器,忽略空格/换行符,只匹配内容:
RSpec::Matchers.define :be_matching_content do |expected| match do |actual| actual.gsub(/\s/,'').should == expected.gsub(/\s/,'') end diffable end
我可以像这样使用它:
body = " some data \n more data" body.should be_matching_content("some data\nmore wrong data")
但是,当测试失败时(如上所述),diff输出看起来不太好:
-some data -more wrong data + some data + more data
是否可以配置diffable输出?第一行有些数据是正确的,但第二行错误数据是错误的.仅将第二行作为失败的根本原因是非常有用的.
解决方法
我相信你应该在RSpec中禁用默认的diffable行为并替换你自己的实现:
RSpec::Matchers.define :be_matching_content do |expected| match do |actual| @stripped_actual = actual.gsub(/\s/,'') @stripped_expected = expected.gsub(/\s/,'') expect(@stripped_actual).to eq @stripped_expected end failure_message do |actual| message = "expected that #{@stripped_actual} would match #{@stripped_expected}" message += "\nDiff:" + differ.diff_as_string(@stripped_actual,@stripped_expected) message end def differ RSpec::Support::Differ.new( :object_preparer => lambda { |object| RSpec::Matchers::Composable.surface_descriptions_in(object) },:color => RSpec::Matchers.configuration.color? ) end end RSpec.describe 'something'do it 'should diff correctly' do body = " some data \n more data" expect(body).to be_matching_content("some data\nmore wrong data") end end
产生以下内容:
Failures: 1) something should diff correctly Failure/Error: expect(body).to be_matching_content("some data\nmore wrong data") expected that somedatamoredata would match somedatamorewrongdata Diff: @@ -1,2 +1,2 @@ -somedatamorewrongdata +somedatamoredata
如果需要,您可以使用自定义不同,甚至可以将整个匹配器重新实现为对diff命令的系统调用,如下所示:
♥ diff -uw --label expected --label actual <(echo " some data \n more data") <(echo "some data\nmore wrong data") --- expected +++ actual @@ -1,2 @@ some data - more data +more wrong data
干杯!