2017-12-11 15 views
0

나는 $ user-> posts() -> get()을 조롱하려고합니다.PhpUnit - 관계가있는 laravel 모델 조롱

예를 들어 서비스 :

use App\Models\User; 

class SomeClass{ 
    public function getActivePost(User $user): Collection 
    { 
     return $user->posts()->get(); 
    } 
} 

내 모델 : 및 모델 :

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 
use Illuminate\Database\Eloquent\Relations\HasMany; 
use \App\Models\Post; 

class User extends Model 
{ 
    public function posts() : HasMany 
    { 
     return $this->hasMany(Post::class); 
    } 
} 

이 작동하지 않습니다

$this->user = Mockery::mock(User::class); 
$this->user 
    ->shouldReceive('wallets->get') 
    ->andReturn('test output'); 

오류 : 형식 오류 :의 반환 값 Mockery_2_App_Models_User :: posts()는 Illuminate \ Datab의 인스턴스 여야합니다. ase \ Eloquent \ Relations \ HasMany, Mockery_4__demeter_posts의 인스턴스는 반환 유형 힌트가없는 경우

을 반환합니다. 수정하고 반송해야합니까()? idk how

+0

은 그 오류가 일치하지 않는 것을 귀하의 코드에 무엇이든 포함시켜야합니다. – Devon

답변

0

나는 여기에 모의를 사용하지 않을 것입니다. 그럴 필요가 전혀 없습니다. 따라서 단위 테스트는 다음과 같습니다.

  • 사용자를 생성하십시오.
  • 사용자가 작성한 게시물을 만듭니다.
  • 게시물 사용자 &에 대한 단언을 수행하십시오.

그래서 코드는 내 테스트에서 이런 식으로 뭔가를 할 것이다 :

$user = factory(User::class)->create(); 
$posts = factory(Post::class, 5)->create(['user_id' => $user->id]); 

$this->assertNotEmpty($user->id); 
$this->assertNotEmpty($posts); 

$this->assertEquals(5, $posts->fresh()->count()); 
$this->assertEquals($user->id, $post->fresh()->first()->user_id); 
0

당신은 당신이 할 수있는 관계를 테스트하려는 경우 :

/** @test */ 
function user_has_many_posts() 
{ 
    $user = factory(User::class)->create(); 
    $post= factory(Post::class)->create(['user_id' => $user->id]); 

    //Check if database has the post.. 
    $this->assertDatabaseHas('posts', [ 
     'id' => $post->id, 
     'user_id' => $user->id, 
    ]); 
    //Check if relationship returns collection.. 
    $this->assertInstanceOf('\Illuminate\Database\Eloquent\Collection', $user->posts); 

}