如何让 PHPUnit 等待条件测试?

Posted

技术标签:

【中文标题】如何让 PHPUnit 等待条件测试?【英文标题】:How to make PHPUnit wait for condition test? 【发布时间】:2018-08-28 20:41:58 【问题描述】:

每次运行测试时,它都会在第一次运行时失败并在第二次运行时通过。

代码如下:

 /** @test */
    public function some_function_test()
        
            $file = file_exists($this->path.'file');

            if ($file) 
                echo "\n file exists! \n";
            else
                $this->createFile;
            

         $this->assertEquals($file, true);

        

当我删除文件并再次运行测试时,它失败了。 这告诉我断言在我的 if 语句之前运行。

如果断言首先运行,我可以让它等待我的条件测试吗?

【问题讨论】:

Assertion 不能在 if 之前运行。如果您没有文件-您使用createFile 创建它,这是一种方法吗?那么它应该是createFile(),但$file 变量在else 分支中没有变化。这就是你的测试失败的原因。 @u_mulder 但是 $file 没有改变也没关系,因为它有一个完整的路径和文件名!如果文件存在,断言应该返回真!但似乎我在创建文件之前进行了断言检查。为什么如果我第二次运行测试总是通过? 因为第二次运行测试文件是创建的 【参考方案1】:

您的断言将永远if 之前运行。

您的测试失败,因为在else 分支中,您在使用createFile 创建文件后没有更改$file,因此在else 分支中$file 仍然是false。我想您需要将$file 更改为true

public function some_function_test()

    $file = file_exists($this->path.'file');

    if ($file) 
        echo "\n file exists! \n";
    else
        $this->createFile();    // you're calling a method, aren't you?
        $file = true;
    

    $this->assertEquals($file, true);
    // or simplier:
    // $this->assertTrue($file);

【讨论】:

是的,我在 else 语句之后调用了一个方法,但是一旦这个方法创建了文件,断言应该看到并返回 true!或者有什么我没有抓住的东西。 else 语句是否将 $file 更改为 false?如果有怎么办? 你明白断言检查变量的值吗?它检查变量$file 的值。如果文件不存在,$file 的值为 false。创建文件时 - 您只需创建文件,不会更改 $file 的值。所以它仍然是false。清楚了吗? "是 else 语句将 $file 更改为 false 吗?" -- else 分支被执行 因为 $file 是@987654336 @. @u_mulder 谢谢你现在一切正常。我仍然是专门编程 TDD 的新手。你个摇滚!

以上是关于如何让 PHPUnit 等待条件测试?的主要内容,如果未能解决你的问题,请参考以下文章

PhpUnit 如何运行 --filter 与多个条件

如何告诉 phpunit 在失败时停止

如何在测试过程中停止 PHPUnit 但仍然获得失败/报告列表?

如何在测试代码时完全覆盖条件(例如 PHP 和 xdebug)

如何让 PHPUnit 运行所有的测试?

如何让浓缩咖啡测试在特定条件下失败