【问题标题】:Why doesn't the "assertSelectorExists()" assertion show the failure message that I specify?为什么“assertSelectorExists()”断言不显示我指定的失败消息?
【发布时间】:2022-01-21 02:24:41
【问题描述】:

当 PHPUnit 9.5.11 测试失败时,我正在尝试显示自定义消息(正在测试的 URL)。在我的 Symfony 4.4 应用程序中。

类很简单:

class BaseTestCase extends PantherTestCase

在我的测试中,我:

$client = static::createPantherClient();
$crawler = $client->request('GET', $url);
$this->assertSelectorExists('.some-class', $url); // <- this should display the tested $url, since the second argument is supposed to be the message to show on failure

但是当测试失败时,我得到的只是:

  1. App\Tests\PropertyListingTest::testListingWithFullQueryString 与 数据集 #0 ('') Facebook\WebDriver\Exception\NoSuchElementException: 没有这样的元素:无法找到元素:{“method”:“css selector","selector":".some-class"} (会话信息: 无头铬=97.0.4692.71)

这里发生了什么?如果我运行这个:

$this->assertEquals("a", "b", "!!!!TEST FAILED!!!!");

它按预期工作:

!!!!测试失败!!!!断言两个字符串相等时失败。 - - 预期的 +++ 实际 @@ @@ -'一个' +'b'

【问题讨论】:

  • 你确定你的$url不是空的$this-&gt;assertSelectorExists('.some-class', $url);吗?

标签: symfony testing phpunit symfony-panther


【解决方案1】:

这种行为在我看来实际上是一个错误。

因为如果你看看 assertSelectorExists 在内部做了什么(见下文)......

public static function assertSelectorExists(string $selector, string $message = ''): void
{
    $client = self::getClient();

    if ($client instanceof PantherClient) {
        $element = self::findElement($selector); // NoSuchElementException is thrown here
        self::assertNotNull($element, $message); // so the message is never used
        
        return;
    }

    self::assertNotEmpty($client->getCrawler()->filter($selector));
}

...你会注意到它期望findElement 在没有找到元素的情况下返回null。但问题是 findElement 在这种情况下不会返回 null,而是会引发异常。

为了解决这个问题,我会像这样制作自己的 assertSelectorExists 版本:

$client = static::createPantherClient();
$crawler = $client->request('GET', $url);
$this->assertSelectorExistsSafe($client, '.some-class', $url);

protected function assertSelectorExistsSafe($client, $selector, $message)
{
    try {
        $element = $client->findElement($client->createWebDriverByFromLocator($selector));
    } catch (\Facebook\WebDriver\Exception\NoSuchElementException $e) {
        $element = null;
    }
    self::assertNotNull($element, $message);
}

【讨论】:

    【解决方案2】:

    如果我理解你的意图

    $client = static::createPantherClient();
    $response = $client->request('GET', $url);
    $crawler = $response->getContent();
    

    现在crawler 变量保存了您从url 变量中获得的实际数据

    如何继续测试此信息由您决定

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多