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

等価性マッチャー

Rubyでは、等価性を扱うためのいくつかの異なるメソッドが公開されています。

a.equal?(b) # オブジェクトの同一性 - aとbは同じオブジェクトを参照します a.eql?(b) # オブジェクトの同値性 - aとbは同じ値を持ちます a == b # オブジェクトの同値性 - aとbは型変換を伴って同じ値を持ちます

これらの説明はガイドラインですが、言語によって強制されるものではありません。任意のオブジェクトは、独自の意味論を持つこれらのメソッドを実装することができます。

rspec-expectationsには、これらのメソッドに対応するマッチャーがいくつか含まれています:

expect(a).to equal(b) # a.equal?(b)が成立する場合にパスします
expect(a).to eql(b) # a.eql?(b)が成立する場合にパスします
expect(a).to be == b # a == bが成立する場合にパスします

また、DSLのような感覚を持つ2つのマッチャーも含まれています:

expect(a).to be(b) # a.equal?(b)が成立する場合にパスします
expect(a).to eq(b) # a == bが成立する場合にパスします

eq (==) を使用して比較する

「compare_using_eq.rb」という名前のファイルが以下の内容であるとき:

RSpec.describe "a string" do
it "is equal to another string of the same value" do
expect("this string").to eq("this string")
end

it "is not equal to another string of a different value" do
expect("this string").not_to eq("a different string")
end
end

RSpec.describe "an integer" do
it "is equal to a float of the same value" do
expect(5).to eq(5.0)
end
end

rspec compare_using_eq.rb を実行すると

出力に "3 examples, 0 failures" が含まれているはずです。

== を使用して比較する

「compare_using_==.rb」という名前のファイルが以下の内容であるとき:

RSpec.describe "a string" do
it "is equal to another string of the same value" do
expect("this string").to be == "this string"
end

it "is not equal to another string of a different value" do
expect("this string").not_to be == "a different string"
end
end

RSpec.describe "an integer" do
it "is equal to a float of the same value" do
expect(5).to be == 5.0
end
end

rspec compare_using_==.rb を実行すると

出力に "3 examples, 0 failures" が含まれているはずです。

eql (eql?) を使用して比較する

「compare_using_eql.rb」という名前のファイルが以下の内容であるとき:

RSpec.describe "an integer" do
it "is equal to another integer of the same value" do
expect(5).to eql(5)
end

it "is not equal to another integer of a different value" do
expect(5).not_to eql(6)
end

it "is not equal to a float of the same value" do
expect(5).not_to eql(5.0)
end

end

rspec compare_using_eql.rb を実行すると

出力に "3 examples, 0 failures" が含まれているはずです。

equal (equal?) を使用して比較する

「compare_using_equal.rb」という名前のファイルが以下の内容であるとき:

RSpec.describe "a string" do
it "is equal to itself" do
string = "this string"
expect(string).to equal(string)
end

it "is not equal to another string of the same value" do
expect("this string").not_to equal("this string")
end

it "is not equal to another string of a different value" do
expect("this string").not_to equal("a different string")
end

end

rspec compare_using_equal.rb を実行すると

出力に "3 examples, 0 failures" が含まれているはずです。

be (equal?) を使用して比較する

「compare_using_be.rb」という名前のファイルが以下の内容であるとき:

RSpec.describe "a string" do
it "is equal to itself" do
string = "this string"
expect(string).to be(string)
end

it "is not equal to another string of the same value" do
expect("this string").not_to be("this string")
end

it "is not equal to another string of a different value" do
expect("this string").not_to be("a different string")
end

end

rspec compare_using_be.rb を実行すると

出力に "3 examples, 0 failures" が含まれているはずです。