2017-02-28 63 views
2

我试着为我的UserShop模型之间的关系创建一个单元测试,但是当我运行vendor\\bin\\phpunit这个错误被抛出时,我没有因为我是单元测试的新手,所以对此有所了解。我试图在我的控制器上运行我的代码,以查看这种关系是否真正起作用,幸运的是它正在按预期工作,但在phpunit中运行时没有。我为这个phpunit做了什么错误而不能和Models一起工作?Laravel 5.4单元测试 - 调用成员函数连接()null

Fatal error: Uncaught Error: Call to a member function connection() on null in E:\projects\try\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php:1013

Stack trace: E:\projects\try\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(979): Illuminate\Database\Eloquent\Model::resolveConnection(NULL) E:\projects\try\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(843): Illuminate\Database\Eloquent\Model->getConnection() E:\projects\try\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(804): Illuminate\Database\Eloquent\Model->newBaseQueryBuilder() E:\projects\try\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(788): Illuminate\Database\Eloquent\Model->newQueryWithoutScopes() E:\projects\try\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(1316): Illuminate\Database\Eloquent\Model->newQuery() E:\projects\try\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(1328): Illum in E:\projects\try\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php on line 1013

这是我UserTest.php

<?php 

namespace Tests\Unit; 

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

use App\User; 
use App\Shop; 

class UserTest extends TestCase 
{ 

    protected $user, $shop; 

    function __construct() 
    { 
     $this->setUp(); 
    } 

    function setUp() 
    { 
     $user = new User([ 
      'id' => 1, 
      'first_name' => 'John', 
      'last_name' => 'Doe', 
      'email' => '[email protected]', 
      'password' => 'secret', 
      'facebook_id' => null, 
      'type' => 'customer', 
      'confirmation_code' => null, 
      'newsletter_subscription' => 0, 
      'last_online' => null, 
      'telephone' => null, 
      'mobile' => null, 
      'social_security_id' => null, 
      'address_1' => null, 
      'address_2' => null, 
      'city' => null, 
      'zip_code' => null, 
      'signed_agreement' => 0, 
      'is_email_confirmed' => 0 
     ]); 

     $user = User::find(1); 
     $shop = new Shop([ 
      'id' => 1, 
      'user_id' => $user->id, 
      'name' => 'PureFoods Hotdog2', 
      'description' => 'Something that describes this shop', 
      'url' => null, 
      'currency' => 'USD' 
     ]); 
     $user->shops()->save($shop); 

     $shop = new Shop([ 
      'id' => 2, 
      'user_id' => $user->id, 
      'name' => 'PureFoods Hotdog', 
      'description' => 'Something that describes this shop', 
      'url' => null, 
      'currency' => 'USD' 
     ]); 

     $user->shops()->save($shop); 

     $this->user = $user; 

    } 

    /** @test */ 
    public function a_user_has_an_id(){ 
     $user = User::find(1); 
     $this->assertEquals(1, $user->id); 
    } 

    /** @test */ 
    public function a_user_has_a_first_name(){ 
     $this->assertEquals("John", $this->user->first_name); 
    } 

    /** @test */ 
    public function a_user_can_own_multiple_shops(){ 
     $shops = User::find(1)->shops()->get(); 
     var_dump($this->shops); 
     $this->assertCount(2, $shops); 
    } 
} 

看来,这个错误是由下面这行代码导致的: $user->shops()->save($shop); - 在我的样本航线或控制器上运行,但是当这种代码实际工作在phpunit

运行user.php的

时抛出
<?php 

namespace App; 

use Illuminate\Notifications\Notifiable; 
use Illuminate\Foundation\Auth\User as Authenticatable; 

class User extends Authenticatable 
{ 
    use Notifiable; 

    protected $guarded = [ 'id' ]; 
    protected $table = "users"; 

    /** 
    * The attributes that should be hidden for arrays. 
    * 
    * @var array 
    */ 
    protected $hidden = [ 
     'password', 'remember_token', 
    ]; 


    /** 
    * returns the Shops that this user owned 
    */ 
    public function shops(){ 
     return $this->hasMany('App\Shop'); 
    } 
} 

Shop.php

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Shop extends Model 
{ 
    protected $guarded = [ 'id' ]; 
    protected $table = "shops"; 

    /** 
    * returns the Owner of this Shop 
    */ 
    public function owner(){ 
     return $this->belongsTo('App\User'); 
    } 
} 

任何帮助将是非常赞赏。谢谢!

回答

7

首先,设置()每次测试之前调用,所以你不应该在构造函数中所有的

二中调用它,你应该调用父::设置()在你的设置( )来初始化应用程序实例。

0

您正在为两个商店分配id'2'。

由于我假设shop table id字段是自动增量字段,因此分配不应该是必需的。

也看看database factories in the Laravel docs,它会为你简化事情。

1

实施例:

<?php 

class ExampleTest extends TestCase 
{ 
    private $user; 

    public function setUp() 
    { 
    parent::setUp(); 

    $this->user = \App\User::first(); 
    } 

    public function testExample() 
    { 
     $this->assertEquals('[email protected]', $this->user->email); 
    } 
} 
相关问题