ctasca/magefix

Magento Behat Fixtures 库

3.1.2 2016-08-19 19:01 UTC

README

一个用于简化 BehatMage 创建 Magento 的 fixtures 的库。目前可用的 fixtures 类型包括:

  • 分类
  • 客户
  • 简单产品
  • 可配置产品
  • 捆绑产品
  • 分组产品
  • 销售订单类型(访客)
  • 销售订单类型(收银台)
  • 销售订单类型(客户)
  • API 角色
  • API 用户
  • 管理员用户
  • OAuth 消费者

Scrutinizer Code Quality Build Status

请按照以下步骤开始,如果在安装过程中遇到任何问题,请首先检查常见问题部分。

安装

1) 将 Magefix 添加到您的 composer.json

将以下内容添加到您的 composer.json

...
 "require-dev": {
    "ctasca/magefix": "dev-develop"
 },
 ...

2) 创建 FixtureLocator

在 features/fixtures 目录中创建 FixtureLocator 类。此类必须为 Magefix\Parser\ResourceLocator 接口中指定的 getLocation() 方法提供具体实现。

getLocation 方法应返回 yml fixtures 文件的路径。**重要:**请确保路径以正斜杠结尾。

以下是一个 ResourceLocator 的示例

use Magefix\Parser\ResourceLocator;

class FixturesLocator implements ResourceLocator
{
    public function getLocation()
    {
        return 'features/fixtures/yaml/';
    }
}

3) 自动加载 FixtureLocator 和 feature/fixtures

在您的 composer.json 中添加以下内容

 "autoload": {
        "psr-0": {
            "": [
                ...
                "features/fixtures"
            ],
            ...
            "FixturesLocator" : "features/fixtures/FixturesLocator"
        }
    },

运行 composer dump-autoloadcomposer dumpautoload 以重新生成自动加载文件。

**注意:**可以创建多个 FixtureLocator。这主要取决于项目需求。要使用不同的 fixtures 定位器,请参阅创建 fixtures使用多个定位器部分。

创建 fixtures

1) 创建 fixture yml

在选定的 fixture 位置,创建一个包含 fixture 定义的 yml 文件。项目的 examples 目录中可以找到 fixture yml 文件的示例。

以下是一个 Magento 简单产品 fixture 的示例

fixture:
    model: catalog/product
    data_provider: 'Data\Providers\SimpleProduct'
    attributes:
        name: 'Simple Product Fixture'
        description: 'Long Description'
        short_description: 'Short Description'
        weight: 10
        status: 1
        visibility: 4
        price: 100.00
        tax_class_id: 0
        website_ids: '{{getWebsiteIds}}'
        attribute_set_id : '{{getDefaultAttributeSetId}}'
        category_ids: '{{getCategoryIds}}'
        type_id: '{{getTypeId}}'
        sku: '{{getSku}}'
    stock:
        stock_data:
            qty: '{{getStockQty}}'
            is_in_stock: 1
            manage_stock: 1

2) 创建 Fixture 的 Data Provider

大多数 fixtures yml 文件中的 fixture 节点可以使用 {{DATA_PROVIDER_METHOD}} 语法定义动态生成的值。这意味着在解析 fixture 的 yml 时,将通过指定的 Data Provider 动态分配该节点的值。

简单来说,**Data Providers** 是数据对象,应添加到 features/fixtures 目录中,并提供 fixture 的 yml 中指定的任何方法。如果指定的 Data Provider 没有或没有部分方法,将抛出 ProviderMethodNotFound 异常。

在 fixtures 的 yml 定义中可以切换作用域内的数据提供者,从而允许重用现有数据提供者。例如,在创建销售订单 fixture 时,我们可能还想创建产品和客户 fixture。

fixture:
    model: sales/quote
    data_provider: 'Data\Providers\SalesOrderCustomer'
    attributes:
        store_id: '{{getStoreId}}'
    quote_products:
        products:
            0:
                model: catalog/product
                data_provider: 'Data\Providers\SimpleProduct'
                attributes:
                    name: 'Simple Product Fixture'
                    description: 'Long Description'
                    short_description: 'Short Description'
                    weight: 10
                    status: 1
                    visibility: 4
                    price: 100.00
                    tax_class_id: 0
                    website_ids: '{{getWebsiteIds}}'
                    attribute_set_id : '{{getDefaultAttributeSetId}}'
                    category_ids: '{{getCategoryIds}}'
                    type_id: '{{getTypeId}}'
                    sku: '{{getSku}}'
                stock:
                    stock_data:
                        qty: 10
                        is_in_stock: 1
                        manage_stock: 1
    checkout:
        data_provider: 'Data\Providers\SalesOrderCustomer'

以下是一个 Data Provider 的示例

use Mage_Catalog_Model_Product_Type;
use Mage_Catalog_Model_Product_Visibility;
use Magefix\Fixtures\Data\Provider;

class SimpleProduct implements Provider
{
    public function getWebsiteIds()
    {
        return [1];
    }

    public function getDefaultAttributeSetId()
    {
        return 4;
    }

    public function getCategoryIds()
    {
        return [5, 14];
    }

    public function getSku()
    {
        $random = substr(md5(rand()), 0, 7);

        return 'SKU-' . $random;
    }

    public function getTypeId()
    {
        return Mage_Catalog_Model_Product_Type::TYPE_SIMPLE;
    }

    public function getStockQty()
    {
        return 10;
    }

    public function getFixtureImage()
    {
        return '/vagrant/features/fixtures/images/placeholder.jpg';
    }

    public function getVisibility()
    {
        return Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH;
    }
}

3) 在 Behat 的 Feature 类中创建 Fixture

要构建 Behat 运行时的 fixture,请编辑所需的 Feature Context 文件并执行以下操作:

1) 添加 use 语句并包含 Fixtures RegistryBuilder

use Magefix\Fixtures\Registry as FixturesRegistry;
use Magefix\Fixture\Factory\Builder as FixtureBuilder;

2) 添加 Fixtures Registry 特性 use 语句

/**
 * Default features context.
 */
class FeatureContext extends MagentoContext
{
    use FixturesRegistry;

在 Behat 的 Feature 类中调用 Builder::build 操作

FixtureBuilder::build(
            FixtureBuilder::SIMPLE_PRODUCT_FIXTURE_TYPE, new FixturesLocator(), 'simple-product.yml', '@AfterFeature'
        );

Builder 的 fixture 类型常量

  • Builder::SIMPLE_PRODUCT_FIXTURE_TYPE
  • Builder::CUSTOMER_FIXTURE_TYPE
  • Builder::CATEGORY_FIXTURE_TYPE
  • Builder::CONFIGURABLE_PRODUCT_FIXTURE_TYPE
  • Builder::BUNDLE_PRODUCT_FIXTURE_TYPE
  • Builder::GROUPED_PRODUCT_FIXTURE_TYPE
  • Builder::SALES_ORDER_FIXTURE_TYPE
  • Builder::API_ROLE_FIXTURE_TYPE
  • Builder::API_USER_FIXTURE_TYPE
  • Builder::ADMIN_FIXTURE_TYPE
  • Builder::OAUTH_CONSUMER_FIXTURE_TYPE

清理固定装置

构建固定装置后,要通过Behat钩子删除它,只需将钩子提供到Builderbuild方法。

注意:如果没有指定钩子,创建的固定装置将不会添加到Registry进行清理,因此不会被删除。

Image of Data Providers Directory Image of Data Providers Directory

可用的钩子

  • @BeforeSuite
  • @AfterSuite
  • @BeforeFeature
  • @AfterFeature
  • @BeforeScenario
  • @AfterScenario
  • @BeforeStep
  • @AfterStep

插件

插件以特性形式存在。以下特性可用

AdminPanelSession

提供管理管理面板会话键的操作。

  • getCurrentUrlKey
  • getSessionKeyForUrl(string)

DriverCurrentUrl

检索驱动程序当前url。

  • getDriverCurrentUrl()

DriverSession

提供刷新驱动程序会话的功能。

  • refreshSelenium2Session()

DriverSwitcher

提供在窗口和i-frames之间切换驱动程序作用域的功能。

  • switchToIFrame(string|object) 接受字符串或SensioLabs\Behat\PageObjectExtension\PageObject\Element对象

ElementObjectGetter

提供在不提供初始选择器的情况下创建Element对象的功能。

  • getElementObject(string)

Spinner

为上下文提供“等待”功能。

  • spin(lamba, wait) 其中lamba是一个函数,wait是秒数超时的操作。

  • spinUntilVisible(element, wait) 旋转直到元素可见。默认超时为60秒。元素可以是字符串或SensioLabs\Behat\PageObjectExtension\PageObject\Element对象。

  • spinUntilInvisible(element, wait) 旋转直到元素不可见。默认超时为60秒。元素可以是字符串或SensioLabs\Behat\PageObjectExtension\PageObject\Element对象。

  • spinAndClick(element, wait) 旋转并单击元素。默认超时为60秒。元素可以是字符串或SensioLabs\Behat\PageObjectExtension\PageObject\Element对象。

  • spinAndPress(element, wait) 旋转并按元素。默认超时为60秒。元素可以是字符串或SensioLabs\Behat\PageObjectExtension\PageObject\Element对象。

  • spinAndDo(element, action) 旋转并执行指定操作。元素可以是字符串或SensioLabs\Behat\PageObjectExtension\PageObject\Element对象,操作是字符串(例如“press”)。还可以接受可选的条件和超时。默认超时为60秒。

WindowResizer

提供调整上下文窗口大小的功能。

  • resizeToDesktopWindow(DriverInterface)

  • resizeToMobileWindow(DriverInterface)

使用多个定位器

要使用多个定位器,只需创建它们并确保它们通过composer自动加载。加载后,将所需的定位器实例传递给Builderbuild方法。

常见问题

请详细说明遇到的设置问题以及逐步修复说明,并在可能的情况下更新项目本身以提供更持久的修复。

  • 目前没有报告的常见问题

许可证

版权所有 (C) 2015-2016

特此授予任何获得此软件及其相关文档文件(“软件”)副本的任何人免费处理该软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许将软件提供给他人,以便他们这样做,前提是以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

本软件按“现状”提供,不提供任何形式的保证,无论是明示的、暗示的,包括但不限于适销性、特定用途和侵权不保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是否因合同、侵权或其他行为而产生,源自、因之或与之有关软件或其使用或其它交易。