メインコンテンツまでスキップ

ディファブルマッチャの定義

マッチャがディファブルとして定義されると、オブジェクトが単純なプリミティブではない場合、出力には提出されたオブジェクトの差分が含まれます。

ディファブルマッチャの定義(diff-lcs 1.4を使用)

次の内容で「diffable_matcher_spec.rb」という名前のファイルがあるとします。

RSpec::Matchers.define :be_just_like do |expected|
match do |actual|
actual == expected
end

diffable
end

RSpec.describe "two\nlines" do
it { is_expected.to be_just_like("three\nlines") }
end

rspec ./diffable_matcher_spec.rbを実行すると、

次のように失敗するはずです。

       Diff:
@@ -1 +1 @@
-three
+two

ディファブルマッチャの定義(diff-lcs 1.3を使用)

次の内容で「diffable_matcher_spec.rb」という名前のファイルがあるとします。

RSpec::Matchers.define :be_just_like do |expected|
match do |actual|
actual == expected
end

diffable
end

RSpec.describe "two\nlines" do
it { is_expected.to be_just_like("three\nlines") }
end

rspec ./diffable_matcher_spec.rbを実行すると、

次のように失敗するはずです。

       Diff:
@@ -1,3 +1,3 @@
-three
+two
lines

actualの再定義(diff-lcs 1.4.4を使用)

ディフィングが機能するようにするために、actualが読み取りたいファイルの名前である場合など、actualを上書きする必要がある場合があります。これを実現するには、マッチャ内で@actualを上書きする必要があります。

次の内容で「redefine_actual_matcher_spec.rb」という名前のファイルがあるとします。

RSpec::Matchers.define :have_content do |expected|
match do |actual|
@actual = File.read(actual).chomp

values_match? expected, @actual
end

diffable
end

RSpec.describe 'Compare files' do
context 'when content is equal' do
it { expect('data.txt').to have_content 'Data' }
end

context 'when files are different' do
it { expect('data.txt').to have_content "No\nData\nhere" }
end
end

および、「data.txt」という名前のファイルがあるとします。

Data

rspec ./redefine_actual_matcher_spec.rb --format documentationを実行すると、

終了ステータスは0ではないはずです。

また、出力には次の内容が含まれるはずです。

2 examples, 1 failure

さらに、出力には次の内容が含まれるはずです。

       @@ -1,4 +1,2 @@
-No
Data
-here

actualの再定義(diff-lcs 1.3を使用)

次の内容で「redefine_actual_matcher_spec.rb」という名前のファイルがあるとします。

RSpec::Matchers.define :have_content do |expected|
match do |actual|
@actual = File.read(actual).chomp

values_match? expected, @actual
end

diffable
end

RSpec.describe 'Compare files' do
context 'when content is equal' do
it { expect('data.txt').to have_content 'Data' }
end

context 'when files are different' do
it { expect('data.txt').to have_content "No\nData\nhere" }
end
end

および、「data.txt」という名前のファイルがあるとします。

Data

rspec ./redefine_actual_matcher_spec.rb --format documentationを実行すると、

終了ステータスは0ではないはずです。

また、出力には次の内容が含まれるはずです。

2 examples, 1 failure

さらに、出力には次の内容が含まれるはずです。

       @@ -1,4 +1,2 @@
-No
Data
-here