2

我想通过表单提交和重定向中的正确响应来测试登录演示者操作。例如,我想测试在正确登录后,用户被重定向到某处并显示带有文本“登录成功”的闪烁消息。

在所有示例中,测试正确表单行为的唯一方法是测试我是否获得了 RedirectResponse(见下文)。是不是太少了?如何进行我描述的测试?甚至可能吗?

function testSignUpSuccess()
{
    $post = [
        'identity' => 'john.doe@gmail.com',
        'password' => 'superSecret123',
    ];

    $pt = $this->getPresenterTester()
        ->setPresenter('Sign')
        ->setAction('up')
        ->setHandle('signUpForm-submit')
        ->setPost($post);

    $response = $pt->run();

    Assert::true($response instanceof Nette\Application\Responses\RedirectResponse);

    //TODO test that flashMessage: 'login successful' is displayed on final page
}

注意:此示例使用PresenterTester工具来获取响应,但重要的部分是关于使用该响应,因此无论您是通过本机方式还是通过此工具获取它都无关紧要。

4

1 回答 1

1

不,这是不可能的,因为 Nette 使用 session 来存储 flash 消息。您在控制台上没有会话。但是您可以Tester\DomQuery用来测试页面上是否有所需的内容(例如登录的用户名)。

$dom = Tester\DomQuery::fromHtml($html);

Assert::true( $dom->has('form#registration') );
Assert::true( $dom->has('input[name="username"]') );
Assert::true( $dom->has('input[name="password"]') );
Assert::true( $dom->has('input[type="submit"]') );

您可能需要在测试中关闭闪存消息以避免会话错误。您可以在 BasePresenter 中执行此操作。

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    /**
     * @var bool
     */
    public $allowFlashMessages = TRUE;

    /**
     * Saves the message to template, that can be displayed after redirect.
     *
     * @param  string
     * @param  string
     *
     * @return \stdClass
     */
    public function flashMessage($message, $type = 'info')
    {
        if ($this->allowFlashMessages) {
            return parent::flashMessage($message, $type);
        }
    }
}

然后,您可以在测试中将其关闭。

isset($presenter->allowFlashMessages) && $presenter->allowFlashMessages = FALSE;
于 2017-01-19T00:59:42.090 回答