2

いくつかのミドルウェアを含むスリム アプリケーションがあります。

ルートの認証を実行し、次のようにルートを取得します。

$route = $this->getApplication()->router()->getCurrentRoute();

私は現在それをテストしており、Mockery を使用して連鎖呼び出しの結果をモックしようとしているので、ルートを効果的に指定できます。

$mock = M::mock('\Api\SessionMiddleware[getApplication]');
$mock->shouldReceive('router->getCurrentRoute')->andReturn('myRoute');

これはうまくいきません。: を呼び出そうとしrequire('lib/demeter/router.php')ますが、これが存在しないため失敗します。

私も試しました:

$mock = M::mock('\Api\SessionMiddleware')->shouldDeferMissing();
$mock->shouldReceive('getApplication->router->getCurrentRoute')->andReturn('myRoute');

これも機能せず、次のように失敗します。

Failed opening required 'lib/demeter/getApplication.php'

私は何が欠けていますか?

4

2 に答える 2

3

受け入れられた答えがありますが、将来のユーザーに別の解決策を提供したかったのです。

ルーターが demeter チェーンの中間ステップとしてのみ使用される場合は、ルーターをモックする必要はありません。これを試して:

$mock = M::mock('\Api\SessionMiddleware');
$mock->shouldReceive('getApplication->router->getCurrentRoute')->andReturn('myRoute');

鍵は への呼び出しを削除することshouldDeferMissing()です。この場合、これはデメテル チェーンに干渉しているようです。

このようにして、 の実際の実装に何も転送しない「純粋な」モックSessionMiddlewareが返されます。呼び出され'myRoute'たときに応答できるはずです。$mock->getApplication()->getRouter()->getCurrentRoute()

于 2014-05-04T13:36:55.213 に答える
1

また、ルーターをモックする必要があります。router()メソッドが順番にルーター モックを返すようにします。

$mock = M::mock('\Api\SessionMiddleware[getApplication]');
$routerMock = M::mock('My\Router');
$routerMock->shouldReceive('getCurrentRoute')->andReturn('myRoute');
$mock->shouldReceive('router')->andReturn($routerMock);
于 2014-02-20T17:57:38.033 に答える