使用 Mockery 进行单元测试返回 false

Posted

技术标签:

【中文标题】使用 Mockery 进行单元测试返回 false【英文标题】:Unit Testing with Mockery return false 【发布时间】:2019-08-02 23:21:57 【问题描述】:

我已经写了这个测试:

public function testSetVisitorLog()

    $visitorRepositoryMock = Mockery::mock('App\Repositories\VisitorStatisticRepository');
    $this->app->instance('App\Repositories\VisitorStatisticRepository',$visitorRepositoryMock);
    $visitorRepositoryMock->shouldReceive('setLog')->once();

    $visitorAction = new VisitorStatisticAction($visitorRepositoryMock);
    $this->assertEquals(true,$visitorAction->setLog('fars'));

我在 VisitorStatisticAction 类中调用 setLog 并输入字符串

在 VisitorStatisticAction 我有这个:

public function setLog($organizationSlug)

    dd($this->repository->setLog($organizationSlug));
    if (!$this->repository->setLog($organizationSlug)) 
        return false;
    
    return true;

我不知道为什么dd($this->repository->setLog($organizationSlug)); 是返回null

setLog in repository 是这样的:

public function setLog($organizationSlug)

    $visitor = new VisitorStatistic();
    $visitor->organization_slug = $organizationSlug;
    $visitor->ip = request()->ip();
    $visitor->url = url()->current();
    $visitor->save();
    return $visitor;

【问题讨论】:

你使用的是什么版本的 Laravel? laravel 5.7 版 【参考方案1】:

我找到了答案:)

添加andReturn()会返回正确答案

$visitorRepositoryMock->shouldReceive('setLog')->once()->andReturn(new VisitorStatistic());

【讨论】:

以上是关于使用 Mockery 进行单元测试返回 false的主要内容,如果未能解决你的问题,请参考以下文章

PHP 单元测试 - 使用 Mockery 模拟静态自动加载类

Laravel & Mockery - 单元测试关系数据

未定义的属性:Laravel 单元测试中的 Mockery_3_App_Repositories_ArticleRepositoryInterface::$id

错误:在 null 上调用成员函数 create(),单元测试(嘲弄)

嘲弄 os.type() 不起作用

返回参数被发送到 Mockery 模拟函数?