web-dev-qa-db-ja.com

phpunitのassertEqualsとassertSameの違いは?

PHPUnitにはassertEqualsメソッドが含まれています。 https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertEquals

AssertSameメソッドもあります: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertSame

一見、同じことをしているように見えます。 2つの違いは何ですか?両方が指定されているのはなぜですか?

105
Kevin Burke

私は散発的に両方を使用しますが、ドキュメントによると:

assertSame

2つの変数$message$expectedが同じtypevalueを持たない場合、$actualで識別されるエラーを報告します。

上記の抜粋の例でわかるように、これらは'2204'2204を渡します。1つはassertSameであり、1つは基本的にint,であるため、stringを使用すると失敗します。

'2204' !== 2204
assertSame('2204', 2204) // this test fails

assertEquals

「2つの変数$ expectedと$ actualが等しくない場合、$ messageで識別されるエラーを報告します。」

assertEqualsはデータ型を考慮していないため、上記の2204の例を使用します。

'2204' == 2204
assertEquals('2204', 2204) // this test passes

上記の例に対していくつかの単体テストを実行したところ、実際に文書化された動作が発生しました。

176
Mike Purcell

オブジェクト比較に関しては:

assertSame:2つのオブジェクトが同じオブジェクトインスタンスを参照している場合にのみアサートできます。そのため、2つの個別のオブジェクトがすべての属性に対してまったく同じ値を持っている場合でも、同じインスタンスを参照しないとassertSameは失敗します。

    $expected = new \stdClass();
    $expected->foo = 'foo';
    $expected->bar = 'bar';

    $actual = new \stdClass();
    $actual->foo = 'foo';
    $actual->bar = 'bar';

    $this->assertSame($expected, $actual); FAILS

assertEquals:2つの別個のオブジェクトがいずれの場合でも属性値と一致する場合にアサートできます。そのため、オブジェクトの一致をアサートするのに適したメソッドです。

    $this->assertEquals($expected, $actual); PASSES

https://phpunit.de/manual/current/en/appendixes.assertions.html

18
Grigoreas P.
$this->assertEquals(3, true);
$this->assertSame(3, true);

最初のものは合格します!

2番目は失敗します。

それが違いです。

常にassertSameを使用する必要があると思います。

18
bronze man

前述したように、2つの要素がtypevalueを共有しない場合、AssertSameはエラーを報告しますが、 ドキュメント からこれに注意することも重要です:

2つの変数$ expectedと$ actualが同じオブジェクトを参照していない場合にエラー$ messageを報告します。

したがって、タイプと値を共有している場合でも、このテストも失敗します。

class SameTest extends TestCase
{
    public function testFailure()
    {
        $this->assertSame(new stdClass, new stdClass);
    }
}

また、

// Passes
$this->assertSame("123.", "123.");
$this->assertEquals("123.", "123");
// Fails
$this->assertSame("123.", "123");
1
GogromaT

前述のように、assertEquals()は、タイプジャグリングまたは__magicプレゼンテーションメソッドを持つオブジェクト(たとえば、__toString())による解釈値に関するものです。

assertSame()の適切な使用例は、シングルトンファクトリをテストすることです。

class CacheFactoryTest extends TestCase
{
    public function testThatCacheFactoryReturnsSingletons()
    {
        $this->assertSame(CacheFactory::create(), CacheFactory::create());
    }
}
0

assertSame()==実際の出力と期待されるパラメーターが同じかどうかをテストします。

あれは :

$this->assertSame('$expected','$expected');

または

$this->assertSame('100','100');

assertEquals ==ウェブサイトのページに関して見ると、2つの「テーブル」があるページがあるので、assertEqualsを実行すると、カウント機能を使用して「テーブル」が2であるというカウントをチェックします。例えば:

$this->assertEquals(2, $var->filter('table')->count()); 

ここでは、assertEqualsがWebページに2つのテーブルが見つかったことを確認していることがわかります。ブラケット内の「#division name」を使用して、ページにある部門を使用することもできます。

例2:

public function testAdd()
{
    $calc = new Calculator();

    $result = $calc->add(30, 12);

    // assert that our calculator added the numbers correctly!
    $this->assertEquals(42, $result);
}
0
Arpan Buch