【问题标题】:CakePHP: Testing Front End PagesCakePHP:测试前端页面
【发布时间】:2014-09-07 13:26:26
【问题描述】:

我想测试我网站上的所有前端页面,以确保用户无需登录即可访问它们。这是我想出的(可行的),但我想知道是否有更好的方法来做到这一点:

public function testAboutUsPage() {
    $result = $this->testAction('/pages/about_us', array('return' => 'view'));

    if(! $result) {
        $this->assertFalse($result);
    }
}

如果页面不受 auth 组件保护,它将返回视图的内容。如果它受到保护(需要登录),$result 将为空。

【问题讨论】:

  • 您的代码具体有什么问题?如果您概述它或就您想要改进的内容提出具体问题,您可能会得到一个/更好的答案。
  • 没什么问题。我只是想知道是否有更好/更合适的方法来做到这一点。我上面的代码感觉就像一个小“黑客”
  • 我不认为使用 Cake 的测试套件是一种 hack,如果它可以工作并达到你想要的效果,那就太好了。

标签: cakephp phpunit


【解决方案1】:

您走在正确的轨道上,尽管无论您是否得到结果,您都应该做出一些断言。在您当前的代码中,如果结果为 false,您将只输入您的 if(! $result) 块 - 这当然意味着下一行 $this->assertFalse($result); 将通过。您刚刚检查了上一行是否为假!

当您进行测试时,您会做出一个您认为有效的断言。如果您的代码被破坏,您的断言将无效,您的测试将失败。

我会这样做:(请注意,我作为第二个参数传递给 assert 调用的字符串基本上是代码失败时您将收到的错误消息。)

要测试一个可以查看的公共页面:

public function testPublicPage() {
    $result = $this->testAction('/pages/public', array('return' => 'view'));
    $this->assertNotEmpty($result, "we were not able to view a public page");
}

并测试无法查看私人页面:

public function testPrivatePage() {
    $result = $this->testAction('/pages/private', array('return' => 'view'));
    $this->assertNull($result, "we were able to view a private page");
}

关于测试的另一件事是:你在编写测试时,要确保它实际上是在测试你应该两者兼而有之的东西:

a) 运行它并确保它通过
同样重要的是:
b) 故意破坏与该测试相关的代码,并确保它失败。

否则你不知道你的测试实际上是在测试任何东西!我不会在这里讨论“测试驱动开发”——但基本上是你首先编写测试(在编写代码之前),运行它以确保它失败,然后编写代码直到你的测试通过。这是确保您同时勾选 a) 和 b) 的另一种好方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-11
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多