我正在使用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,我需要做一些不同的事情(,但它对我有用,所以我想我会分享它。