【问题标题】:can't get session singleton in EcomDev PHPUnit test在 EcomDev PHPUnit 测试中无法获得会话单例
【发布时间】:2013-01-14 18:16:28
【问题描述】:

经过认真调试后,我发现在使用 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'] 索引而引起的

配置中是否有我可能缺少的东西导致这种情况?

【问题讨论】:

    标签: unit-testing magento testing phpunit


    【解决方案1】:

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

    如果您已从 EcomDev_PHPUnit_Test_Case 类之一扩展您的测试用例,则可以使用以下代码来使用模拟替换会话对象。

    $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);
    

    【讨论】:

    • @Ivan - 更准确地说,你谈到的问题是什么?
    • @Ivan 是否有机会公开 EcomDev_PHPUnit_Test_Case_Controller::reset() 方法,以便非控制器测试可以初始化 base_url 和其他参数?这将有助于解决这个问题......
    • 重要提示:始终使用 Ivan 的模拟会话方式。我发现使用类似 $this->replaceByMock('singleton', 'admin/session', $this->mockSession('admin/session'));导致模拟在不同的测试中停留,可能会破坏东西
    • 谢谢,这有助于解决我在checkout/session 中遇到的类似问题...尝试使用@barbazul 描述的类似方法,但结果不佳。
    【解决方案2】:

    你可以在phpunit.xml中设置主机

    <phpunit ....>
        ...
        <php>
            <server name='HTTP_HOST' value='http://local.mysite.com' />
        </php>
    </phpunit>
    

    【讨论】:

      猜你喜欢
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 2017-07-18
      • 2016-10-09
      • 2014-02-24
      • 2017-12-24
      • 2014-07-21
      相关资源
      最近更新 更多