stevegrunwell/phpunit-markup-assertions

为PHPUnit提供的断言,用于验证标记中元素的存在或状态

v1.4.0 2022-12-29 02:24 UTC

README

Build Status Code Coverage GitHub Release

此库引入了MarkupAssertionsTrait特性,用于在PHPUnit测试中使用。

这些断言允许您检查生成的标记,而无需将测试与DOMDocument或丑陋的正则表达式混淆。如果您使用PHP生成任何标记,PHPUnit Markup Assertions特性旨在使输出可测试,而不会使测试变得脆弱。

示例

use PHPUnit\Framework\TestCase;
use SteveGrunwell\PHPUnit_Markup_Assertions\MarkupAssertionsTrait;

class MyUnitTest extends TestCase
{
    use MarkupAssertionsTrait;

    /**
     * Ensure the #first-name and #last-name selectors are present in the form.
     */
    public function testRenderFormContainsInputs()
    {
        $markup = render_form();

        $this->assertContainsSelector('#first-name', $markup);
        $this->assertContainsSelector('#last-name', $markup);
    }
}

安装

要将PHPUnit Markup Assertions添加到项目中,首先使用Composer安装库

$ composer require --dev stevegrunwell/phpunit-markup-assertions

接下来,将SteveGrunwell\PHPUnit_Markup_Assertions\MarkupAssertionsTrait特性导入到每个将利用断言的测试用例中

use PHPUnit\Framework\TestCase;
use SteveGrunwell\PHPUnit_Markup_Assertions\MarkupAssertionsTrait;

class MyTestCase extends TestCase
{
    use MarkupAssertionsTrait;
}

使PHPUnit Markup Assertions全局可用

如果您希望方法在整个测试套件中可用,您可以考虑子类化PHPUnit测试用例并应用特性

# tests/TestCase.php

namespace Tests;

use PHPUnit\Framework\TestCase as BaseTestCase;
use SteveGrunwell\PHPUnit_Markup_Assertions\MarkupAssertionsTrait;

class TestCase extends BaseTestCase
{
    use MarkupAssertionsTrait;
}

然后更新其他测试用例以使用您的新基类

# tests/Unit/ExampleTest.php

namespace Tests/Unit;

use Tests\TestCase;

class MyUnitTest extends TestCase
{
    // This class now automatically has markup assertions.
}

可用方法

这些是通过MarkupAssertionsTrait提供给PHPUnit的断言。

assertContainsSelector()

断言给定的字符串包含匹配给定选择器的元素。

(string) $selector
要查找的元素的查询选择器。
(string) $markup
应包含$selector的标记。
(string) $message
断言失败时显示的消息。

示例

public function testBodyContainsImage()
{
    $body = getPageBody();

    $this->assertContainsSelector('img', $body, 'Did not find an image in the page body.');
}

assertNotContainsSelector()

断言给定的字符串不包含匹配给定选择器的元素。

此方法是对assertContainsSelector()的逆操作。

(string) $selector
要查找的元素的查询选择器。
(string) $markup
不应包含$selector的标记。
(string) $message
断言失败时显示的消息。

assertSelectorCount()

断言匹配给定选择器的元素出现的次数。

(int) $count
期望的匹配元素的数量。
(string) $selector
要查找的元素的查询选择器。
(string) $markup
运行断言的标记。
(string) $message
断言失败时显示的消息。

示例

public function testPostList()
{
    factory(Post::class, 10)->create();

    $response = $this->get('/posts');

    $this->assertSelectorCount(10, 'li.post-item', $response->getBody());
}

assertHasElementWithAttributes()

断言给定标记中存在具有给定属性的元素。

(array) $attributes
应在元素上找到的HTML属性数组。
(string) $markup
应包含具有提供的$attributes的元素的标记。
(string) $message
断言失败时显示的消息。

示例

public function testExpectedInputsArePresent()
{
    $user = getUser();
    $form = getFormMarkup();

    $this->assertHasElementWithAttributes(
        [
            'name' => 'first-name',
            'value' => $user->first_name,
        ],
        $form,
        'Did not find the expected input for the user first name.'
    );
}

assertNotHasElementWithAttributes()

断言给定标记中不存在具有给定属性的元素。

(array) $attributes
不应在元素上找到的HTML属性数组。
(string) $markup
不应包含具有提供的$attributes的元素的标记。
(string) $message
断言失败时显示的消息。

assertElementContains()

断言具有给定选择器的元素包含一个字符串。

(string) $contents
在DOM节点的内容中查找的字符串。
(string) $selector
要查找的元素的查询选择器。
(string) $markup
应包含$selector的标记。
(string) $message
断言失败时显示的消息。

示例

public function testColumnShowsUserEmail()
{
    $user = getUser();
    $table = getTableMarkup();

    $this->assertElementContains(
        $user->email,
        'td.email',
        $table,
        'The <td class="email"> should contain the user\'s email address.'
    );
}

assertElementNotContains()

断言具有给定选择器的元素不包含一个字符串。

此方法是对assertElementContains()的逆操作。

(string) $contents
在DOM节点的内容中查找的字符串。
(string) $selector
要查找的元素的查询选择器。
(string) $markup
应包含$selector的标记。
(string) $message
断言失败时显示的消息。

assertElementRegExp()

断言具有给定选择器的元素包含一个字符串。

此方法与assertElementContains()类似,但使用正则表达式而不是简单的字符串匹配。

(string) $regexp
在DOM节点中查找的正则表达式模式。
(string) $selector
要查找的元素的查询选择器。
(string) $markup
应包含$selector的标记。
(string) $message
断言失败时显示的消息。

assertElementNotRegExp()

断言具有给定选择器的元素不包含一个字符串。

此方法是对 assertElementRegExp() 的逆操作,其行为类似于 assertElementNotContains(),但使用正则表达式而不是简单的字符串匹配。

(string) $regexp
在DOM节点中查找的正则表达式模式。
(string) $selector
要查找的元素的查询选择器。
(string) $markup
应包含$selector的标记。
(string) $message
断言失败时显示的消息。