测试响应

The TestResponse 类提供了一些有用的函数来解析和测试来自测试用例的响应。通常,TestResponse 将作为您 控制器测试HTTP 功能测试 的结果提供给您,但您始终可以使用任何 ResponseInterface 直接创建自己的响应。

$result = new \CodeIgniter\Test\TestResponse($response);
$result->assertOK();

测试响应

无论您是在测试中收到 TestResponse 还是自己创建了一个,您都可以在测试中使用一些新的断言。

访问请求/响应

request()

如果在测试期间设置了 Request 对象,您可以直接访问它。

$request = $results->request();

response()

这允许您直接访问响应对象。

$response = $results->response();

检查响应状态

isOK()

根据响应是否被认为是“正常”返回布尔值 true/false。这主要由 200 或 300 范围内的响应状态码决定。除非在重定向中,否则空主体不被视为有效。

if ($result->isOK()) {
    // ...
}

assertOK()

此断言仅使用 isOK() 方法来测试响应。 assertNotOK() 是此断言的反面。

$result->assertOK();

isRedirect()

根据响应是否为重定向响应返回布尔值 true/false。

if ($result->isRedirect()) {
    // ...
}

assertRedirect()

断言 Response 是 RedirectResponse 的实例。 assertNotRedirect() 是此断言的反面。

$result->assertRedirect();

assertRedirectTo()

断言 Response 是 RedirectResponse 的实例,并且目标与给定的 uri 匹配。

$result->assertRedirectTo('foo/bar');

getRedirectUrl()

返回为 RedirectResponse 设置的 URL,或在失败时返回 null。

$url = $result->getRedirectUrl();
$this->assertEquals(site_url('foo/bar'), $url);

assertStatus(int $code)

断言返回的 HTTP 状态码与 $code 匹配。

$result->assertStatus(403);

会话断言

assertSessionHas(string $key, $value = null)

断言结果会话中存在值。如果传递了 $value,还将断言变量的值与指定的值匹配。

$result->assertSessionHas('logged_in', 123);

assertSessionMissing(string $key)

断言结果会话不包含指定的 $key。

$result->assertSessionMissing('logged_in');

标头断言

assertHeader(string $key, $value = null)

断言响应中存在名为 $key 的头。如果 $value 不为空,还会断言值匹配。

$result->assertHeader('Content-Type', 'text/html');

assertHeaderMissing(string $key)

断言响应中不存在名为 $key 的头。

$result->assertHeader('Accepts');

DOM 助手

您收到的响应包含许多助手方法,用于检查响应中的 HTML 输出。这些方法在测试中的断言中很有用。

see()

根据页面上的文本是否存在(无论是单独存在,还是更具体地存在于由类型、类或 ID 指定的标签中)返回布尔值 true/false。

// Check that "Hello World" is on the page
if ($results->see('Hello World')) {
    // ...
}

// Check that "Hello World" is within an h1 tag
if ($results->see('Hello World', 'h1')) {
    // ...
}

// Check that "Hello World" is within an element with the "notice" class
if ($results->see('Hello World', '.notice')) {
    // ...
}

// Check that "Hello World" is within an element with id of "title"
if ($results->see('Hello World', '#title')) {
    // ...
}

方法 dontSee()seeElement() 方法完全相反

// Checks that "Hello World" does NOT exist on the page
if ($results->dontSee('Hello World')) {
    // ...
}

// Checks that "Hellow World" does NOT exist within any h1 tag
if ($results->dontSee('Hello World', 'h1')) {
    // ...
}

seeElement()

方法 seeElement()dontSeeElement() 与之前的方法非常相似,但它们不检查元素的值。相反,它们只是检查元素是否存在于页面上

// Check that an element with class 'notice' exists
if ($results->seeElement('.notice')) {
    // ...
}

// Check that an element with id 'title' exists
if ($results->seeElement('#title')) {
    // ...
}

// Verify that an element with id 'title' does NOT exist
if ($results->dontSeeElement('#title')) {
    // ...
}

seeInField()

方法 seeInField() 检查是否存在任何具有名称和值的输入标签

// Check that an input exists named 'user' with the value 'John Snow'
if ($results->seeInField('user', 'John Snow')) {
    // ...
}

// Check a multi-dimensional input
if ($results->seeInField('user[name]', 'John Snow')) {
    // ...
}

seeCheckboxIsChecked()

最后,您可以使用 seeCheckboxIsChecked() 方法检查复选框是否存在且是否已选中

// Check if checkbox is checked with class of 'foo'
if ($results->seeCheckboxIsChecked('.foo')) {
    // ...
}

// Check if checkbox with id of 'bar' is checked
if ($results->seeCheckboxIsChecked('#bar')) {
    // ...
}

DOM 断言

您可以执行测试以查看特定元素/文本/等是否存在于响应主体中,方法是使用以下断言。

assertSee(string $search = null, string $element = null)

断言文本/HTML 存在于页面上,无论是单独存在,还是更具体地说,存在于由类型、类或 ID 指定的标签内

// Verify that "Hello World" is on the page
$result->assertSee('Hello World');

// Verify that "Hello World" is within an h1 tag
$result->assertSee('Hello World', 'h1');

// Verify that "Hello World" is within an element with the "notice" class
$result->assertSee('Hello World', '.notice');

// Verify that "Hello World" is within an element with id of "title"
$result->assertSee('Hello World', '#title');

assertDontSee(string $search = null, string $element = null)

断言与 assertSee() 方法完全相反

// Verify that "Hello World" does NOT exist on the page
$results->assertDontSee('Hello World');

// Verify that "Hello World" does NOT exist within any h1 tag
$results->assertDontSee('Hello World', 'h1');

assertSeeInField(string $field, string $value = null)

断言存在一个具有指定名称和值的输入标签。

// Verify that an input exists named 'user' with the value 'John Snow'
$results->assertSeeInField('user', 'John Snow');

// Verify a multi-dimensional input
$results->assertSeeInField('user[name]', 'John Snow');

使用 JSON

响应通常包含 JSON 响应,尤其是在使用 API 方法时。以下方法可以帮助测试响应。

getJSON()

此方法将返回响应主体作为 JSON 字符串。

/*
 * Response body is this:
 * ['foo' => 'bar']
 */

$json = $result->getJSON();
/*
 * $json is this:
 * {
 *     "foo": "bar"
 * }
`*/

您可以使用此方法来确定 $response 是否实际包含 JSON 内容。

// Verify the response is JSON
$this->assertTrue($result->getJSON() !== false);

注意

请注意,JSON 字符串将在结果中进行美化打印。

assertJSONFragment(array $fragment)

断言 $fragment 存在于 JSON 响应中。它不需要与整个 JSON 值匹配。

/*
 * Response body is this:
 * [
 *     'config' => ['key-a', 'key-b'],
 * ]
 */

// Is true
$result->assertJSONFragment(['config' => ['key-a']]);

assertJSONExact($test)

类似于 assertJSONFragment(),但检查整个 JSON 响应以确保完全匹配。

使用 XML

getXML()

如果您的应用程序返回 XML,您可以通过此方法检索它。