在代码测试之前清除 laravel 4 应用程序的缓存


Clearing cache for laravel 4 app before codeception tests

我正在使用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 中使用以下函数:

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

这似乎是此处文档的建议,但是我收到错误"无法连接模块缓存"。看起来我需要 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'

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

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

但我最终只会收到此错误:

Class 'Codeception'Module'Cache' not found

所以我被困住了。谢谢!

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

是更好的方法。

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

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

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

rm app/storage/cache/*

瞧,缓存已清除。然后在测试文件中,它将如下所示:

$I->runShellCommand('rm -rf app/storage/cache/*');
我决定通过将其包含在我

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

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