Magento集成测试:如何使用fixture而不是config.xml默认值?

时间:2013-03-01 21:42:20

标签: php magento testing phpunit

我们正在使用IvanChepurnyi's EcomDev_PHPUnit,这似乎有一些很好的功能,可以用Magento编写单元和集成测试,包括有关向数据库加载数据和从数据库加载数据的声明功能。只是,我只能让它工作到一半:我可以使用fixture来获取数据数据库,但是我的测试总是从数据库以外的意外地方获取数据,比如config.xml。 / p>

例如,假设我创建了一个带有管理配置文件的简单模型:

应用程序/代码/小区/我/事情的/ etc / config.xml中:

<?xml version="1.0"?>
<config>
    <modules>
        <My_Thing>
            <version>0.0.1</version>
        </My_Thing>
    </modules>
    <global>
        <helpers>
            <thing>
                <class>My_Thing_Helper</class>
            </thing>
        </helpers>
    </global>
    <default>
        <thing>
            <it>
                <arbitrary>value</arbitrary>
            </it>
        </thing>
    </default>
    <phpunit>
        <suite>
            <modules>
                <My_Thing/>
            </modules>
        </suite>
    </phpunit>
</config>

应用程序/代码/小区/我/事情的/ etc / settings.xml中:

<?xml version="1.0"?>
<config>
    <tabs>
        <thing translate="label" module="my_thing">
            <label>Thing</label>
        </thing>
    </tabs>
    <sections>
        <thing translate="label">
            <label>Thing Settings</label>
            <tab>thing</tab>
            <frontend_type>text</frontend_type>
            <show_in_default>1</show_in_default>
            <show_in_website>1</show_in_website>
            <show_in_store>1</show_in_store>
            <groups>
                <it translate="label">
                    <label>It</label>
                    <frontend_type>text</frontend_type>
                    <sort_order>120</sort_order>
                    <show_in_default>1</show_in_default>
                    <show_in_website>1</show_in_website>
                    <show_in_store>1</show_in_store>
                    <fields>
                        <arbitrary translate="label">
                            <label>Arbitrary</label>
                            <frontend_type>text</frontend_type>
                            <validate>required-entry</validate>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </arbitrary>
                  </fields>
                </it>
            </groups>
        </thing>
    </sections>
</config>

应用程序/代码/小区/我/事情/助手/ Data.php:

<?php
class My_Thing_Helper_Data extends Mage_Core_Helper_Abstract
{
    const CONFIG_IT_ARBITRARY = 'thing/it/arbitrary';

    /**
     * Get the arbitrary value.
     *
     * @return string
     */
    public static function getArbitrary()
    {
        return Mage::getStoreConfig(self::CONFIG_IT_ARBITRARY);
    }
}

应用程序/代码/小区/我/事情/测试/助手/ DataTest.php:

<?php
class My_Thing_Helper_DataTest extends EcomDev_PHPUnit_Test_Case_Controller
{
    /**
     * The helper we're testing.
     */
    public $target = null;

    /**
     * Set up configuration for testing
     */
    public function setUp()
    {
        parent::setUp();
        $this->target = Mage::helper('thing');
    }

    /**
     * Test that paths are joined correctly.
     * 
     * @loadFixture
     */
    public function testGetArbitrary()
    {
        $this->assertEquals(
            'something',
            $this->target->getArbitrary()
        );
    }
}

应用程序/代码/小区/我/事情/测试/助手/数据测试/ testGetArbitrary.yaml:

tables:
  core/config_data:
    - path: thing/it/arbitrary
      value: something

我意识到上面的测试是设计的,但重点是即使我创建了一个夹具来将“任意”值设置为“某事”,测试也会失败,因为它从config.xml默认值中获取值< em>即使'something'值在数据库中。这是为什么?为了从测试数据库中获取数据而不是缓存或config.xml默认值,我还需要为phpunit或EcomDev做一些其他技巧吗?

顺便说一下,如果我在不断轮询测试数据库的值时运行phpunit,我看到something插入到正确的位置。测试只是从那里得不到价值。

0 个答案:

没有答案