在代码测试之前清除laravel 4 app的缓存

时间:2014-12-13 06:35:50

标签: php laravel-4 acceptance-testing codeception

我使用codeception为laravel应用程序运行验收测试。我遇到的一个问题是,当登录页面被缓存时,我的登录测试开始失败,我想,我已经自动登录了。我认为情况就是这样,因为当我清除缓存时我的测试再次开始传递,并且他们通常会在没有更改测试或应用程序代码的情况下开始失败。

这是有问题的登录测试,现在提取到帮助方法

public function login($username, $password, $I) {
    $I->amOnPage('users/login');
    $I->fillField('email', $username);
    $I->fillField('password', $password);
    $I->click('Login');
    $I->amOnPage('admin/');
    $I->see('Welcome');
  }

每当测试失败时,我就会定期清理缓存,但它会变得乏味。我希望能够注册一个帮助程序来为我清除缓存,并在我的所有测试中调用该函数。我使用AcceptanceHelper.php中的以下函数将函数解析为建议here的帮助器:

  public function clearCache($I) {
    $cache = $this->getModule('Cache');
    $cache->flush();
  }

这似乎是文档here所建议的内容,但我收到错误"模块缓存无法连接"。看起来我需要Laravel4模块,所以我将它添加到我的acceptance.suite.yml文件中,但没有运气,我收到此错误:

SQLSTATE[28000] [1045] Access denied for user 'stephen'@'localhost' (using password: NO)  

我以为我需要在配置文件中授权mysql,但这似乎也没有用。这是我的acceptance.suite.yml文件:

class_name: AcceptanceTester
modules:
    enabled:
        - PhpBrowser
        - AcceptanceHelper
        - Laravel4
    config:
        PhpBrowser:
          url: 'http://104.131.29.69:8000/'
        Laravel4:
          user: 'root'
          password: 'pAsSwOrD'

最后我读了this回答,似乎我实际上不应该在配置文件中包含Laravel4,而且我的帮助函数看起来应该更像这样:

public function clearCache($I) {
$L = $I->getLaravel4();
Cache::flush();
}

但我最终得到了这个错误:

Class 'Codeception\Module\Cache' not found

所以我被卡住了。谢谢!

2 个答案:

答案 0 :(得分:1)

好的,所以我想出了如何做到这一点。显然,有一个名为cli的模块,您可以将其包含在acceptance.suite.yml文件中,如下所示:

class_name: AcceptanceTester
modules:
    enabled:
        - PhpBrowser
        - AcceptanceHelper
        - Cli

此模块允许您在脚本中使用runShellCommand()函数的shell命令。由于我的缓存存储在app / storage / cache /目录中的文件中,我需要执行的shell命令是:

rm app/storage/cache/*

并清除了voilá缓存。然后在测试文件中它将如下所示:

$I->runShellCommand('rm -rf app/storage/cache/*');

我决定通过将它包含在我用来登录的函数中来简化这一点,因为我知道我想在每次登录之前清除缓存我只是在AcceptanceHelper中的登录函数中包含该行,然后是在我的所有测试中均可访问。

这是一个解决方法,因为它与我正在使用的那种缓存不相关(如果我使用memcached我需要做一些不同的事情)但它对我有用所以我想我分享它。

答案 1 :(得分:1)

Artisan::call('cache:clear');

是更好的方法。