无法在EcomDev PHPUnit测试中获取会话单例

vei*_*lig 5 testing phpunit unit-testing magento

经过一些严肃的调试后,我发现在使用EcomDev_PHPUnit模块运行测试时,我无法调用Magento中的会话对象

任何单/模型调用即Mage::getSingleton('admin/session')Mage::getModel('customer/session')最终从抛出一个异常EcomDev_PHPUnit_Controller_Request_Http::getHttpHost()Cannot run controller test, because the host is not set for base url. ,因为这是造成$_SERVER['HTTP_HOST']指标未设置

是否有配置中的某些内容可能导致此问题?

Iva*_*nyi 13

这是与Magento会话初始化相关的问题,它是Magento的内部核心部分.为了摆脱这个错误,就是使用一个模拟对象,它不使用标准的Magento会话初始化过程,因为它使用了核心的php会话.

如果您从一个EcomDev_PHPUnit_Test_Case类扩展了测试用例,则可以使用以下代码替换使用mock的会话对象.

$sessionMock = $this->getModelMockBuilder('admin/session')
        ->disableOriginalConstructor() // This one removes session_start and other methods usage
        ->setMethods(null) // Enables original methods usage, because by default it overrides all methods
        ->getMock();
$this->replaceByMock('singleton', 'admin/session', $sessionMock);
Run Code Online (Sandbox Code Playgroud)

  • 重要提示:始终使用Ivan的模拟会话方式.我发现使用类似$ this-> replaceByMock('singleton','admin/session',$ this-> mockSession('admin/session')); 导致模拟在不同的测试中留下来,可能会破坏东西 (2认同)