Cakephp集成测试登录后我将如何发布请求?

bqf10yzr  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(95)

我试图在cakephpIntegrationTest中进行发布请求,在发布请求的地方,我必须在登录到管理员前缀目录后发送。
我的数据库表名是admin_users
我已经创建了一个AdminUsersFixture,而Fixture有3条记录
其中第一条记录为:

$this->records = [
  [
      'id' => 1,
      'name' => 'jone_due',
      'email' => 'jondue@test.com',
      'password' => 'password',
      'status' => 1,
      'modified' => date('Y-m-d H:i:s'),
      'created' => date('Y-m-d H:i:s'),
  ],
]

我已经编写了管理用户测试控制器.php

<?php 

class AdminUsersTest extends TestCase{
    use IntegrationTestTrait;

    public $fixtures = [
        'app.AdminUsers'
    ];

    public function testAddAuthenticated(): void
    {
          $query = $this->AdminUsers->find()->all();
          $this->assertEquals(3, $query->count());
    }
}

运行测试脚本后,我得到的响应正常

OK (1 test, 1 assertion)

然后尝试登录后的请求和下面的更改我已经写在行动testAddAuthenticated()

public function testAddAuthenticated(): void
{
        $query = $this->AdminUsers->find()->all();
        $this->assertEquals(3, $query->count());

        $user = [
            'email' => 'jondue@test.com',
            'password' => 'password'
        ];
        $this->post('/admin?type=admin',$user);
        debug($this->_response);

        $this->get('/admin/adminUsers/add');
        $this->assertResponseOk();

}

在调试中我总是收到电子邮件和密码是错误的消息。下面是我从html登录

<form method="post" accept-charset="utf-8" action="/admin?type=admin">
    <input type="hidden" name="_method" value="POST">   
    <input type="email" name="email">
    <input type="password" name="password">

    <button name="redirect" type="submit">ログイン</button>
</form>

这是我在PHP单元result中得到的输出

There was 1 failure:

1) App\Test\TestCase\Controller\Admin\AdminUsersTest::testAddAuthenticated
Failed asserting that 302 is between 200 and 204.

在修复程序有任何哈希密码问题吗?我在正确的方式?我如何才能访问后登录后的链接请求?

ua4mk5z4

ua4mk5z41#

您的fixture必须包含散列密码,因为数据将按原样插入到数据库中,它不会通过ORM,在那里您的实体及其密码散列机制将被触发。
还要注意,您不能像这样连续发出两个请求,因为在集成测试中没有实际的状态处理。第二个请求将有一个空会话,这意味着您将不会被验证。
通常,只需检查您的登录请求是否返回了预期的响应就足够了,例如,有效的会话cookie(assertCookie())、预期的会话数据(assertSession())和位置头(assertRedirect())。
用同样的方法进一步测试登录流没有太大意义,因为无论如何,它都将依赖于您为下一个请求手动填充会话数据,这意味着如果响应会话数据有效,则包含该会话数据的请求应该可以正常工作。
无论如何,您都要对其他非登录端点进行相应的测试,在这些端点中,您要用有效的身份验证状态所需的预期数据手动填充会话。
另请参阅

*操作手册〉测试〉设置请求
*Cookbook〉测试〉测试需要身份验证的操作
*操作手册〉测试〉测试受CsrfComponent或SecurityComponent保护的操作
*操作手册〉测试〉Assert方法

相关问题