4

これは、あざけることについての私の側の誤解かもしれません。存在しないクラスまたは存在するクラスをモックすることがなぜ良いことなのかについての説明をいただければ幸いです。

シナリオ例: 2 番目のクラスの出力に依存する 1 つのクラスがあり、出力形式などを変更するとします。これにより、最初のクラスでは時代遅れになっているにもかかわらず、テストが成功し続けるのではないでしょうか?

4

2 に答える 2

5

答えはイエスです!コードでいくつかのテスト容易性の原則を尊重する場合、同じクラス内で 1 つのメソッドを他のメソッドから分離できます。それが単体テストの目標です。

この例を参照してください:

<?php

class User {

    public function years()
    {
        return floor($this->months() / 12);
    }

    public function months()
    {
        // Database call or anything else, it's a black box !
    }

}

class UserTest extends TestCase {

    public function testYearsReturnTheNumberOfYears() 
    {
        $user = \Mockery::mock('User[months]');
        $user->shouldReceive('months')->andReturn(18);

        assertEquals(1, $user->years());
    }

}

monthsメソッドが壊れていても、テストはパスします。さらなる説明については、嘲笑のドキュメントを読んでください。

モッキングは単体テストの鍵です。このツールがないと、コードで何かが壊れている場合、すべてのテストが失敗し、エラーの原因を見つけることができません。PHP は、Ruby や Javascript のようにすべてをモックできるほど柔軟ではありませんが、優れたデザイン パターンを使用すれば、すばらしい仕事をすることができます。

非常に良い例は、すべてのコア クラスをモックできる Laravel です。このように、データベース呼び出しやメール送信の間違いをシミュレートできます。

于 2013-06-05T13:38:43.157 に答える
2

私は同様の問題を抱えていました。依存性注入で同じクラス メソッドをモックしなければならなかった場所。Mockery を使用した部分的なモック...

$mock = Mockery::mock('MyClass[methodToMock1, methodToMock2]', array('constructor parameter 1', 'constructor parameter 2'));
$mock->shouldReceive('methodToMock1')->once()->andReturn('someValue');
$mock->shouldReceive('methodToMock2')->once()->andReturn('someValue2');
$this->assertTrue($mock->methodNum3(), 'some assert');

これが誰かを助けることを願っています。

于 2013-10-31T05:01:05.577 に答える