我试图在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.
在修复程序有任何哈希密码问题吗?我在正确的方式?我如何才能访问后登录后的链接请求?
1条答案
按热度按时间ua4mk5z41#
您的fixture必须包含散列密码,因为数据将按原样插入到数据库中,它不会通过ORM,在那里您的实体及其密码散列机制将被触发。
还要注意,您不能像这样连续发出两个请求,因为在集成测试中没有实际的状态处理。第二个请求将有一个空会话,这意味着您将不会被验证。
通常,只需检查您的登录请求是否返回了预期的响应就足够了,例如,有效的会话cookie(
assertCookie()
)、预期的会话数据(assertSession()
)和位置头(assertRedirect()
)。用同样的方法进一步测试登录流没有太大意义,因为无论如何,它都将依赖于您为下一个请求手动填充会话数据,这意味着如果响应会话数据有效,则包含该会话数据的请求应该可以正常工作。
无论如何,您都要对其他非登录端点进行相应的测试,在这些端点中,您要用有效的身份验证状态所需的预期数据手动填充会话。
另请参阅
*操作手册〉测试〉设置请求
*Cookbook〉测试〉测试需要身份验证的操作
*操作手册〉测试〉测试受CsrfComponent或SecurityComponent保护的操作
*操作手册〉测试〉Assert方法