首页 文章

PhpUnit - 嘲笑laravel模型与关系

提问于
浏览
0

我正在尝试模拟(仅限于示例)$ user-> posts() - > get() .

示例服务:

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');

错误:TypeError:Mockery_2_App_Models_User :: posts()的返回值必须是Illuminate \ Database \ Eloquent \ Relations \ HasMany的实例,返回Mockery_4__demeter_posts的实例

没有返回类型提示(在post()方法上)一切正常 . 我必须修改andReturn()吗?如何

3 回答

  • 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);
    
    }
    
  • 0

    使用带有效类名的别名前缀可以解决此错误 . 如下:

    $m = m::mock('alias:App\Models\User');
    

    更多信息可以在官方文档中找到http://docs.mockery.io/en/latest/reference/creating_test_doubles.html#aliasing

相关问题