2017-01-17 1 views
0

私はMockeryでクラスをモックしようとしています。 新しいLaravelプロジェクトを作成します。php laravel binding mockery instanceが失敗しました

私は内容のコントローラアプリ/ HTTP /コントローラ/ Mockcontroller.phpを作成します。

<?php 

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 

class Mockcontroller extends Controller 
{ 
    function get($id) { 
     return 'FAILED'; 
    } 
} 

私はのget()メソッドをモックとしたいので、私は/ファイルにテストを修正しましたこの内容でExampleTest.php

<?php 

    use Illuminate\Foundation\Testing\WithoutMiddleware; 
    use Illuminate\Foundation\Testing\DatabaseMigrations; 
    use Illuminate\Foundation\Testing\DatabaseTransactions; 

    class ExampleTest extends TestCase 
    { 
     /** 
     * A basic functional test example. 
     * 
     * @return void 
     */ 
     public function testBasicExample() 
     { 
      $mock = Mockery::mock(App\Http\Controllers\Mockcontroller::class); 
      $mock->shouldReceive('get') 
       ->with(10) 
       ->andReturn('SUCCESS'); 
      $this->app->instance(App\Http\Controllers\Mockcontroller::class, $mock); 

      $ctrl = new App\Http\Controllers\Mockcontroller(); 
      dd($ctrl->get(10)); 


     } 
    } 

しかし、私は、次のコマンドを実行します。

vendor/bin/phpunit 

は、私は、この行にDDを交換するときは、この出力

PHPUnit 5.7.5 by Sebastian Bergmann and contributors. 

"FAILED" 
zsh: exit 1  vendor/bin/phpunit 

に取得($ CTRL-> GET(10)); SUCCESS:私は右のテキストを取得

dd($mock->get(10)); 

次の行によって

だから、それは失敗したモックインジェクションです。

モックを正しく挿入する方法はありますか?

答えて

1

$ctrl = new App\Http\Controllers\Mockcontroller();とすると、アプリケーションコンテナを使用せずにコントローラの新しいインスタンスを作成し、その結果モックを作成します。

モックを$this->app->instance(App\Http\Controllers\Mockcontroller::class, $mock);に設定すると、$this->app->make(App\Http\Controllers\Mockcontroller::class);となる必要がありますが、完全に正直なところ、私はあなたがしていることにはあまり意味がありません。

+0

あなたの答えをありがとう。もともと、私はEloquentリポジトリにモックを作成しましたが、空のLaravelプロジェクトからモックを作成したかったのです。だからコントローラを使う。 $ this-> appにはget()メソッドが含まれていません:PHP致命的なエラー:未定義メソッドを呼び出す/ Foundation/Application :: get()/var/www/to.auzuret/を照らします。 tetsmock/tests/ExampleTest.php on line 27 私はLaravel 5.3を使用しています – jedema

+0

申し訳ありません、もちろん '$ app-> make'ではなく$ app-> get'です –

+0

ありがとうございます!そこで、私は、このパスシステムApp \ Controller \を使ってLaravelを含むシステムを短絡しました...もう一度ありがとう – jedema

関連する問題