2016-11-30 5 views
0

私のコードは、モックされたオブジェクトにメソッドがあるかどうかによって分岐します。is_callable on Mockery :: mock()は常にtrueを返します

実際のクラスでは、メソッドの存在を確認する2つのオプションがあります:is_callablemethod_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

$mock = $this->getMockBuilder(stdClass::class) //->setMethods(['foo']) ->getMock(); is_callable([$mock, 'foo']); // gives true only if foo is set 
オブジェクトが実装マジック__call()メソッドがある場合、is_callable()method_exists()はFALSEを返しますが、任意の存在しない方法のためにTRUEを返します。 – Matteo

答えて

0

バニラPHPunitに必要な機能があるので、私はあまりにも遠くに行きました。

関連する問題