使用PHPUnit测试异步方法

3

我尝试使用睡眠和尝试的方法。但有时会失败。那么标准是什么?周围没有明显的东西。谢谢。

function foo($callback)
{
    $bar->asyncCall($callback);
}

function testFoo()
{
    $semaphore = 1;
    foo(function() {
        $semaphore = 0;
    });
    sleep(5) until $semaphore == 0;
}

采用这种方法时,testFoo()有时不会返回。我怀疑出现了死锁。


1
PHP不支持内置的异步(虽然你可以使用PECL Thread)。实际上,你在这里做的只是传递一个匿名函数。你应该提供有关“asyncCall”的更多细节,并可能返回一个响应,以便你可以验证它已被调用。 - D_R
1个回答

2

PHP变量的作用域方式不同,你在测试中没有改变相同的$semaphore变量。你正在创建一个新变量并将其传递给foo(...)的匿名方法。

你需要使用use关键字标记该变量。

function testFoo()
{
    $semaphore = 1;
    foo(function() use ($semaphore) {
        $semaphore = 0;
    });
    $this->assertEquals(0, $semaphore);
}

从这里看来,这不是异步的,所以不需要睡眠。需要更多关于$bar->asynCall()的信息。 在此处查看有关变量作用域的更多信息:http://php.net/manual/en/functions.anonymous.php


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接