0
私のコードは、モックされたオブジェクトにメソッドがあるかどうかによって分岐します。is_callable on Mockery :: mock()は常にtrueを返します
実際のクラスでは、メソッドの存在を確認する2つのオプションがあります:is_callable
とmethod_exists
です。
// Defining mocks for test
$emptyMock = m::mock();
$mockWithExpectation = m::mock()
->shouldReceive('foo')
->andReturn('bar')->getMock();
// Trying to perform checks inside of tested class
method_exists($emptyMock, 'foo'); // false
method_exists($mockWithExpectation, 'foo'); // false
is_callable([$emptyMock, 'foo']); // true
is_callable([$mockWithExpectation, 'foo']); // true
これらのメソッドをモックで呼びましょう。
$emptyMock->foo(); // \BadMethodCallException
$mockWithExpectation->foo(); // 'bar'
ご覧のとおり、メソッドは正しく実行/失敗します。
メソッドが呼び出されるかどうかは、テストされたクラスが明示的に彼がモックを処理していることを知っているかどうかを調べることは可能ですか?
ありがとうございました。
+1
Matteo
オブジェクトが実装マジック__call()メソッドがある場合、is_callable()method_exists()はFALSEを返しますが、任意の存在しない方法のためにTRUEを返します。 –