如何用nette测试器在演示者测试中测试成功表单提交的响应

时间:2015-05-23 06:53:38

标签: php forms unit-testing nette nette-tester

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

在所有示例中,测试正确表单行为的唯一方法是测试我获得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工具来获取响应,但重要的部分是使用该响应,因此无论您是通过本机方式还是通过此工具获取它都无关紧要。

1 个答案:

答案 0 :(得分:0)

不,它不可用,因为Nette使用会话来存储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"]') );

您可能需要在测试中关闭Flash消息以避免会话错误。你可以在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;