152

PHPUnitにはassertEquals()メソッドが含まれていますが、メソッドもありassertSame()ます。一見、同じことをしているように見えます。

2つの違いは何ですか?なぜ両方が指定されているのですか?

4

7 に答える 7

234

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

assertSame

$message2つの変数が同じタイプ$expected$actual持たない場合に識別されるエラーを報告します。」

そして、上記の抜粋の下の例でわかるように、それらは合格'2204'しており、 1つはaであり、もう1つは基本的に:であるため2204、使用に失敗します。assertSamestringint,

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

assertEquals

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

assertEqualsデータ型を考慮していないように見えるので、上記の例を使用します2204

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

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

于 2012-04-20T22:12:29.127 に答える
42

オブジェクトの比較に関しては、次のようになります。

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

参照

于 2016-06-06T09:14:36.327 に答える
21
$this->assertEquals(3, true);
$this->assertSame(3, true);

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

2つ目は失敗します。

それが違いです。

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

于 2013-01-26T10:44:50.047 に答える
3

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

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

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

class SameTest extends TestCase
{
    public function testFailure()
    {
        $this->assertSame(new stdClass, new stdClass);
    }
}
于 2016-11-23T13:26:14.337 に答える
1

さらに、

// Passes
$this->assertSame("123.", "123.");
$this->assertEquals("123.", "123");
// Fails
$this->assertSame("123.", "123");
于 2015-02-13T15:04:57.643 に答える
0

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

あれは :

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

また

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

assertEquals == Webサイトのページに関して見ると、2つの「テーブル」を持つページがあるため、assertEqualsを実行すると、カウント関数を使用して「テーブル」が2であることをカウントで確認します。例えば:

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

ここで、assertEqualsがWebページに2つのテーブルが見つかったことを確認していることがわかります。角かっこ内の「#divisionname」を使用して、ページにある分割を使用することもできます。

例2:

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

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

    // assert that our calculator added the numbers correctly!
    $this->assertEquals(42, $result);
}
于 2013-08-14T12:03:46.457 に答える
0

前述のように、これassertEquals()は主に、型ジャグリングによるものであれ、__ magicプレゼンテーションメソッドを使用したオブジェクトによるものであれ、解釈された値に関するものです(__toString()たとえば)。

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

class CacheFactoryTest extends TestCase
{
    public function testThatCacheFactoryReturnsSingletons()
    {
        $this->assertSame(CacheFactory::create(), CacheFactory::create());
    }
}
于 2018-04-24T10:23:50.130 に答える