PHPUnit 测试实际上运行代码而不是仅仅测试

Posted

技术标签:

【中文标题】PHPUnit 测试实际上运行代码而不是仅仅测试【英文标题】:PHPUnit tests actually runs the code instead of just testing 【发布时间】:2021-09-11 02:56:30 【问题描述】:

我不确定我是否正确设置它,因为这是我第一次使用 phpUnit 测试。

我想测试一个向用户发送电子邮件的特定控制台命令。

这是我的单元测试。

     /**
     * @test
     */
    public function test_expiring_assessment_command_success()
    
        $user = $this->getOrCreateTestUser();
        $assessment = $this->getOrCreateTestOnlineVisit($user, 'cancelled');

        Log::debug($assessment); //this log logs the factory created assessment
        Log::debug(env('APP_ENV')); //testing

        $this->artisan('process:send-visit-emails');
    

This is the code in my SendVistEmails.php

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    
        $from = Carbon::now()->subDays(7)->startOfDay();
        $to = $from->copy()->endOfDay();

        $assessments = Assessment::query()
            ->whereIn('status', ['pending_pause', 'pending'])
            ->whereNotNull('response_required_from')
            ->whereBetween('response_required_from', [$from, $to])
            ->select('details', 'status')
            ->get();

        foreach ($assessments as $a)
            Log::debug($a); //this logs assessments present in DB instead of the one created in my test.
        

        $assessments->each->expire();
    

现在,当我运行 phpunit tests 时,它只是与代码交互并向数据库中的所有用户发送电子邮件。

我只想在我的 SendVistEmails.php 代码中运行命令进行测试,当我记录 $a 时,它应该只有我的单元测试创​​建的评估,而不是来自 DB 的评估。

我花了两天时间阅读了这么多文档,但无法弄清楚我错过了什么。

【问题讨论】:

创建一个只记录日志的处理程序。然后测试该代码。但是,由于这是调试日志记录,因此日志记录本身就是生产系统的“测试”。您通常不需要对此进行测试(可能除了一项向您显示日志记录以您认为的方式工作的测试,例如,在一个测试中,您只在一个孤立的场景中测试您的日志记录期望)。 【参考方案1】:

由于你使用Assessment::query()中的数据库,所以它调用配置的数据库。

处理方法有很多种,其中两种:

    使用另一个配置的数据库进行测试; see this answer of "Laravel: Use different database for testing and local"

    模拟评估门面以返回测试数据; see the laravel documentation

【讨论】:

以上是关于PHPUnit 测试实际上运行代码而不是仅仅测试的主要内容,如果未能解决你的问题,请参考以下文章

PHPUnit - 使用配置文件时“未执行测试”

Laravel phpunit 没有得到正确的网址

Laravel 路由仅在 phpunit 测试期间返回 302 而不是 404 响应

phpunit 测试资源 laravel 5.5 返回集合而不是 json

未经授权的用户在使用 phpunit 测试时返回状态 500 而不是 401

PHPUnit --coverage-html无效