我使用Behat和Mink使用Laravel框架测试应用程序,我想在运行测试之前使用Artisan来设置数据库。
为了正确配置Artisan,我需要知道将要测试的域,以及要使用的Laravel环境。这在behat.yml中列出了所使用的各种配置文件。例如:
default:
extensions:
Behat\MinkExtension\Extension:
base_url: http://www.example.com
...
daniel:
extensions:
Behat\MinkExtension\Extension:
base_url: http://example.dev
是否可以从@BeforeSuite获取base_url的值?
这里的主要问题似乎是@BeforeSuite必须是静态的,因此无法访问Mink,所以我不能$this->getMinkParameter('base_url')
。
我可以使用$suiteEvent->getContextParameters()
访问参数,因此我可以在那里复制网址,但是有更清晰的解决方案。
答案 0 :(得分:1)
一些钩子的工作方式真的让我很烦恼。在实例化上下文之前不会传递参数,因此在实际创建上下文之前,没有干净或简单的方法将它们放入上下文中。最好的办法是使用带有@BeforeScenario
标志的databaseReady
事件,类似:
protected static $databaseReady;
/**
* @BeforeScenario
*/
public function setupDatabase()
{
if (!self::$databaseReady) {
// Set it up…
self::$databaseReady = true;
}
}
但后来我不知道它是如何在Laravel中完成的,但大多数框架都有配置和引导程序,包括不同的环境。保留这些内容并使用引导脚本(可以从@BeforeSuite
钩子运行)来设置环境,包括数据库,这是一个好主意。
答案 1 :(得分:1)
这是一个肮脏的黑客,但如果你必须从@BeforeSuite
钩子这样做,你可以这样得到它:
use Behat\Testwork\ServiceContainer\Configuration\ConfigurationLoader;
$config = new ConfigurationLoader('BEHAT_PARAMS', getcwd() . '/behat.yml'))->loadConfiguration();
$baseUrl = $config[0]['extensions']['Behat\\MinkExtension']['base_url'];