在提交之前,我有以下测试,其中我需要更改隐藏输入字段的值。
如何在提交之前更改隐藏
_token
字段?
public function it_fails_to_submit_aun_invalid_token_post()
{
// Given I am a not authenticated user (guest)
// And I visit the homepage
$this->visit('/auth/login');
// And I fill the login form
$this->type('test@example.org', 'email')
->type('password', 'password');
// TODO: HERE Change the _token field value to simulate invalidation/tampering
// Would be something similar to:
// $this->type('INVALID TOKEN', '_token');
// But this doesn't work because of (apparently) the DOM lib limitations inherited by TestCase
$this->click('Login');
// Then I should see an invalid token message
$this->see('please submit your form again');
}
上的完整测试代码
有一个similar discussion on Laracasts似乎还没有解决这个问题。
答案 0 :(得分:1)
我可以看到您现在已经找到了一个让您的测试工作的解决方案。昨天我确实给了这个更多的想法,我认为尝试改变隐藏字段值的整体问题是用户无法真实地改变该值,所以尝试模拟它没有多大意义它。我认为在你的情况下,使用session()->regenerateToken();
是最有意义的。
然而,在查看失败的测试后,我确实使用call()
方法进行了一些游戏,并提出了一种不同的方法来运行类似的测试:
$this->call('POST', 'auth/login', [
'email' => 'test@example.org',
'password' => 'password',
'_token' => 'foo'
]);
// Get the localhost so we can check the redirect
$localhost = 'http://'.request()->server('HTTP_HOST');
$this->assertRedirectedTo("{$localhost}/auth/login");
$this->assertSessionHasErrors(['token_mismatch' => 'please submit your form again']);
在这里,我使用post
方法发出了call()
请求,并填写了相关字段。然后Laravel提供了assertRedirectedTo()
和assertSessionHasErrors()
方法,它们只是测试您被重定向到正确的位置,并且您的错误消息在会话中(我使用Laravels withErrors()
重定向回来)。
顺便提一下,如果您想检查错误消息是否实际显示,(而不仅仅是在会话中),您可以执行以下操作:
$this->visit("/auth/login")
->see('Have you been away? Please try submitting the form again');
模拟重定向。
答案 1 :(得分:0)
我找到了一个解决方案来编写测试,检查Laravel框架的测试是否符合@Lee的建议。
我添加了/**
* Regresion for https://github.com/alariva/timegrid/issues/39
* @test
*/
public function it_fails_to_submit_an_invalid_token_post()
{
// Given I am a not authenticated user (guest)
// And I visit the homepage
$this->visit('/auth/login');
// And I fill the login form
$this->type('test@example.org', 'email')
->type('password', 'password');
// And my session expired so as a token was invalidated
session()->regenerateToken();
// And I submit the form
$this->press('Login');
// Then I should see a message asking for resubmit
$this->see('please submit your form again');
}
来模拟无效令牌。
尽管如此,这并没有回答如何更改实际的隐藏字段,但不再需要这个特殊需求。
SynonymID Synonym CAS No.
1 Synonym1 1
2 Synonym2 1
3 Synonym3 1