如何在Laravel 5中改变TestCase中的隐藏字段?

时间:2015-12-03 13:17:07

标签: unit-testing laravel laravel-5.1

在提交之前,我有以下测试,其中我需要更改隐藏输入字段的值。

  

如何在提交之前更改隐藏 _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');
}

github project is here

上的完整测试代码

有一个similar discussion on Laracasts似乎还没有解决这个问题。

2 个答案:

答案 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