PHPUnitにはassertEquals()
メソッドが含まれていますが、メソッドもありassertSame()
ます。一見、同じことをしているように見えます。
2つの違いは何ですか?なぜ両方が指定されているのですか?
PHPUnitにはassertEquals()
メソッドが含まれていますが、メソッドもありassertSame()
ます。一見、同じことをしているように見えます。
2つの違いは何ですか?なぜ両方が指定されているのですか?
私は両方を散発的に使用しますが、ドキュメントによると:
assertSame
$message
2つの変数が同じタイプと値$expected
を$actual
持たない場合に識別されるエラーを報告します。」
そして、上記の抜粋の下の例でわかるように、それらは合格'2204'
しており、 1つはaであり、もう1つは基本的に:であるため2204
、使用に失敗します。assertSame
string
int,
'2204' !== 2204
assertSame('2204', 2204) // this test fails
assertEquals
「2つの変数$expectedと$actualが等しくない場合、$messageによって識別されるエラーを報告します。」
assertEquals
データ型を考慮していないように見えるので、上記の例を使用します2204
。
'2204' == 2204
assertEquals('2204', 2204) // this test passes
上記の例に対していくつかの単体テストを実行したところ、実際にそれらの動作が文書化されました。
オブジェクトの比較に関しては、次のようになります。
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
いずれの場合も、2つの別々のオブジェクトがそれらの属性値と一致するかどうかをアサートできます。したがって、これはオブジェクトの一致をアサートするのに適した方法です。
$this->assertEquals($expected, $actual); // PASSES
$this->assertEquals(3, true);
$this->assertSame(3, true);
最初のものは合格します!
2つ目は失敗します。
それが違いです。
常にassertSameを使用する必要があると思います。
前に述べたように、2つの要素がタイプと値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");
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);
}
前述のように、これassertEquals()
は主に、型ジャグリングによるものであれ、__ magicプレゼンテーションメソッドを使用したオブジェクトによるものであれ、解釈された値に関するものです(__toString()
たとえば)。
の良い使用例assertSame()
は、シングルトンファクトリをテストすることです。
class CacheFactoryTest extends TestCase
{
public function testThatCacheFactoryReturnsSingletons()
{
$this->assertSame(CacheFactory::create(), CacheFactory::create());
}
}