CodeIgniter4 HTTP 测试

2020-08-17 17:46 更新

功能测试使您可以查看对应用程序的一次调用的结果。这可能是返回单个Web表单的结果,命中API端点等等。这很方便,因为它允许您测试单个请求的整个生命周期,确保路由有效,响应是正确的格式,分析结果等等。

测试类

功能测试要求您所有的测试类都对该CodeIgniter\Test\FeatureTestCase类进行扩展。由于这扩展了CIDatabaseTestCase,因此您必须始终确保 在执行操作之前调用parent::setUp()parent::tearDown()

  1. <?php namespace App;
  2. use CodeIgniter\Test\FeatureTestCase;
  3. class TestFoo extends FeatureTestCase
  4. {
  5. public function setUp()
  6. {
  7. parent::setUp();
  8. }
  9. public function tearDown()
  10. {
  11. parent::tearDown();
  12. }
  13. }

请求页面

本质上,FeatureTestCase仅允许您在应用程序上调用终结点并返回结果。为此,您可以使用call()方法。第一个参数是要使用的HTTP方法(最常见的是GET或POST)。第二个参数是您网站上要测试的路径。第三个参数接受一个数组,该数组用于填充您正在使用的HTTP动词的超全局变量。因此,GET方法将填充$ _GET变量,而发布请求将填充$ _POST数组。

  1. // Get a simple page
  2. $result = $this->call('get', site_url());
  3. // Submit a form
  4. $result = $this->call('post', site_url('contact'), [
  5. 'name' => 'Fred Flintstone',
  6. 'email' => 'flintyfred@example.com'
  7. ]);

存在用于每个HTTP动词的简写方法,以简化键入并使内容更清晰:

  1. $this->get($path, $params);
  2. $this->post($path, $params);
  3. $this->put($path, $params);
  4. $this->patch($path, $params);
  5. $this->delete($path, $params);
  6. $this->options($path, $params);

注解

$ params数组并不是每个HTTP动词都有意义,但为了保持一致性而包含了该数组。

设定不同的路线

您可以通过将“路线”数组传递给withRoutes()方法来使用路线的自定义集合。这将覆盖系统中的所有现有路由:

  1. $routes = [
  2. [ 'get', 'users', 'UserController::list' ]
  3. ];
  4. $result = $this->withRoutes($routes)
  5. ->get('users');

每个“路由”都是一个3元素数组,包含HTTP动词(或全部为“添加”),要匹配的URI和路由目的地。

设置会话值

您可以使用方法设置自定义会话值,以在单个测试中使用withSession()。发出此请求时,这需要键/值对的数组,这些键/值对应存在于$ _SESSION变量中。这对于测试身份验证非常方便。

  1. $values = [
  2. 'logged_in' => 123
  3. ];
  4. $result = $this->withSession($values)
  5. ->get('admin');

绕过事件

事件很容易在您的应用程序中使用,但在测试过程中可能会出现问题。尤其是用于发送电子邮件的事件。您可以使用以下skipEvents()方法告诉系统跳过任何事件处理:

  1. $result = $this->skipEvents()
  2. ->post('users', $userInfo);

测试响应

执行一个 call()并获得结果后,可以在测试中使用许多新的断言。

注解

响应对象可从公开获得$result-&response。如果需要,可以使用该实例对它执行其他声明。

检查响应状态

isOK()

根据响应是否被认为是“ ok”,返回布尔值true / false。这主要由200或300的响应状态代码确定。

  1. if ($result->isOK())
  2. {
  3. ...
  4. }

assertOK()

该论断仅使用isOK()方法来测试响应。

  1. $this->assertOK();

isRedirect()

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

  1. if ($result->isRedirect())
  2. {
  3. ...
  4. }

assertRedirect()

论断该响应是RedirectResponse的一个实例。

  1. $this->assertRedirect();

assertStatus(int $code)

论断返回的HTTP状态代码与$ code相匹配。

  1. $this->assertStatus(403);

会议断言

assertSessionHas(string $key, $value = null)

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

  1. $this->assertSessionHas('logged_in', 123);

assertSessionMissing(string $key)

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

  1. $this->assertSessionMissin('logged_in');

标头断言

assertHeader(string $key, $value = null)

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

  1. $this->assertHeader('Content-Type', 'text/html');

assertHeaderMissing(string $key)

断言响应中不存在标头名称$ key

  1. $this->assertHeader('Accepts');

Cookie断言

assertCookie(string $key, $value = null, string $prefix = ‘’)

断言响应中存在一个名为$ key的cookie 。如果$ value不为空,还将断言这些值匹配。您可以根据需要通过将cookie前缀作为第三个参数传递来设置它。

  1. $this->assertCookie('foo', 'bar');

assertCookieMissing(string $key)

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

  1. $this->assertCookieMissing('ci_session');

assertCookieExpired(string $key, string $prefix = ‘’)

断言存在一个名为$ key的cookie ,但已过期。您可以根据需要通过将cookie前缀作为第二个参数传递来设置它。

  1. $this->assertCookieExpired('foo');

DOM论断

您可以执行测试,以查看带有以下声明的响应的正文中是否存在特定的元素/文本/等。

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

断言文本/ HTML是否在页面上,无论是本身,还是(更具体而言)在标签内,由类型,类或id指定:

  1. // Check that "Hello World" is on the page
  2. $this->assertSee('Hello World');
  3. // Check that "Hello World" is within an h1 tag
  4. $this->assertSee('Hello World', 'h1');
  5. // Check that "Hello World" is within an element with the "notice" class
  6. $this->assertSee('Hello World', '.notice');
  7. // Check that "Hello World" is within an element with id of "title"
  8. $this->assertSee('Hellow World', '#title');

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

声明与assertSee()方法完全相反的地方:

  1. // Checks that "Hello World" does NOT exist on the page
  2. $results->dontSee('Hello World');
  3. // Checks that "Hello World" does NOT exist within any h1 tag
  4. $results->dontSee('Hello World', 'h1');

assertSeeElement(string $search)

assertSee()类似,但是这仅检查现有元素。它不检查特定的文本:

  1. // Check that an element with class 'notice' exists
  2. $results->seeElement('.notice');
  3. // Check that an element with id 'title' exists
  4. $results->seeElement('#title')

assertDontSeeElement(string $search)

assertSee()类似,但是这仅检查缺少的现有元素。它不检查特定的文本:

  1. // Verify that an element with id 'title' does NOT exist
  2. $results->dontSeeElement('#title');

assertSeeLink(string $text, string $details=null)

断言找到一个匹配标签为$ text的锚标签:

  1. // Check that a link exists with 'Upgrade Account' as the text::
  2. $results->seeLink('Upgrade Account');
  3. // Check that a link exists with 'Upgrade Account' as the text, AND a class of 'upsell'
  4. $results->seeLink('Upgrade Account', '.upsell');

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

断言输入标签具有名称和值:

  1. // Check that an input exists named 'user' with the value 'John Snow'
  2. $results->seeInField('user', 'John Snow');
  3. // Check a multi-dimensional input
  4. $results->seeInField('user[name]', 'John Snow');

使用JSON

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

getJSON()

此方法将以JSON字符串的形式返回响应的主体:

  1. // Response body is this:
  2. ['foo' => 'bar']
  3. $json = $result->getJSON();
  4. // $json is this:
  5. {
  6. "foo": "bar"
  7. }

注解

请注意,JSON字符串将漂亮地打印在结果中。

assertJSONFragment(array $fragment)

断言$fragment在JSON响应中找到。它不需要匹配整个JSON值。

  1. // Response body is this:
  2. [
  3. 'config' => ['key-a', 'key-b']
  4. ]
  5. // Is true
  6. $this->assertJSONFragment(['config' => ['key-a']);

注解

这只是使用phpUnit自己的assertArraySubset() 方法进行比较。

assertJSONExact($test)

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

使用XML

getXML()

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

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号