2017-02-21 12 views
0

現在、私はLaravelの関数をテストする際にいくつかの問題を抱えています。この関数は単純なユーザー保存関数です。Laravelユニットテスト優しい挿入

現在の構造は、ユーザー

class User extends Authenticatable 

を伴うその後、私はUserControllerで

class UserController extends Controller 
{ 
protected $user; 

public function __construct(User $user) 
{ 
    $this->user = $user; 
    $this->middleware('admins'); 
} 

セーブ機能がUserControllerでクラスに定義されている、このクラスでは唯一のリクエスト変数を割り当て、雄弁なセーブを使用していますデータベースに保存する関数。

関数シグネチャは以下の通り:

public function storeUser($request) 
{ 

    $this->user->name  = $request->name; 
    $this->user->email  = $request->email; 
    $this->user->country_id = $request->country_id; 

    return $this->user->save(); 
} 

NewAccountRequestオブジェクトは要求から延びており、要求の検証ルールを有します。

class NewAccountRequest extends Request 
{ 
public function authorize() 
{ 
    return true; 
} 

public function rules() 
{ 
    return [ 
     'name' => 'required|max:255', 
     'email' => 'required|email|max:255|unique:user', 
     'password' => 'required|min:6|max:60', 
    ]; 
} 

} 

私の問題は、このstoreUser関数をユニットテストする方法です。

私は現在のテストがあります。

public function testSaveUserWithEmptyRequest() 
{ 

    $user = $this->createMock(User::class); 
    $controller = new UserController($user); 

    $request = $this->createMock(NewAccountRequest::class); 
    $store = $controller->storeUser($request); 

    $this->assertFalse($store); 
} 

私はユーザーとNewAccountRequestの両方をからかってるし、問題が雄弁から救う、アサーションが偽でなければならないことです。代わりに私はNullを得ています。どのように私は正しく機能をテストすることができますか?

+0

内部 'saveUser'機能である何、あなたがreturn文が欠落しています? –

+0

@ ShadyAtef質問をStoreUserコードで更新し、呼び出し名を修正しました。 –

+0

私は 'User :: class'を模倣しました。PHPUnitでは、' createMock'は、オブジェクトのすべての関数を何も持たず、nullを返すダミーのものに置き換えます。 実際にlaravelでデータベース操作をテストするには、DatabaseMigrations'または 'DatabaseTransactions'で提供されている2つの特性の1つを使用する必要があります。 –

答えて

0
<?php 
namespace Tests\Unit; 

use Tests\TestCase; 
use Illuminate\Foundation\Testing\DatabaseMigrations; 
use Illuminate\Foundation\Testing\DatabaseTransactions; 

class ExampleTest extends TestCase 
{ 
    use DatabaseTransactions; // Laravel will automatically roll back changes that happens in every test 


    public function testSaveUserWithEmptyRequest() 
    { 

     $user = new User(); 
     $controller = new UserController($user); 

     $request = $this->createMock(NewAccountRequest::class); 
     $store = $controller->storeUser($request); 

     $this->assertFalse($store); 
    } 

} 

これは、あなたがやろうとしている正確に何であるが、残念ながらこれは、データベースの例外に失敗します... はリクエストのモックまたは手動でも...それはデータ入力の検証を行うことはありませんクラフトや、あなたの中に例passwordフィールドがNULL可能でないとPDOException: SQLSTATE[HY000]: General error: 1364 Field 'password' doesn't have a default value


要求に応じた機能をテストするために推奨される方法の原因となります、$response = $this->post('/user', ['name' => 'Sally']);

ようlaravelが提供するHTTPテストヘルパーを使用することです

Aはるかに優れたアプローチは、リポジトリデザインパターンを使用することです。これは単純に別々のクラスにあなたのデータベース機能を照合し、コントローラからそれを呼び出す意味..

+0

テストを試みますルートを使用して、私がしたときにフィードバックを提供します。ありがとう! –

+0

ああ、何か言いたいことを忘れてしまった、あなたは '$ this-> expectException(\ PDOException :: class);'を試し始めて、投げられた例外をキャッチします。 –

関連する問題