EcomDev_PHPUnit Tipp #11

Seit Jahren ist das Test-Framework EcomDev_PHPUnit quasi-Standard für Magento Unit Tests. Die aktuelle Version ist 0.3.7 und der letzte Stand der offiziellen Dokumentation ist Version 0.2.0 – seitdem hat sich viel getan, was man leider im Code und GitHub Issues selbst zusammensuchen muss. Diese Serie soll praktische Tipps zur Verwendung sammeln.

Tipp #11: Minimal-Fixtures für Produkttypen

Es folgen einige Beispiel Fixtures für verschiedene Produkttypen. Sie sind so minimal gehalten, dass die Daten gerade ausreichen, um die Produkte und ggf. Produktbeziehungen anzulegen. In den meisten Fällen wird man zusätzliche Attribute wie Name, Status, Sichtbarkeit, Preis und Lagerbestand benötigen.

Konfigurierbares Produkt

eav:
  catalog_product:
    - entity_id: 1
      sku: simple-1
      type_id: simple
      attribute_set_id: 4
      color: green
    - entity_id: 2
      sku: simple-2
      type_id: simple
      attribute_set_id: 4
      color: red
    - entity_id: 3
      sku: conf-1
      type_id: configurable
      attribute_set_id: 4
      super_attributes:
        - color
      configurable_children:
        - 1
        - 2

Hiermit wird ein konfigurierbares Produkt mit zwei Einzelprodukten angelegt (color: green und color: red), vorausgesetzt das color Attribut hat diese Werte. Für Extension-Tests auf einer jungfräulichen Magento-Instanz kann man sich diese Attributwerte wie folgt anlegen:

tables:
  eav_attribute_option:
    - option_id: 3
      attribute_id: 92
      sort_order: 0
    - option_id: 4
      attribute_id: 92
      sort_order: 0
  eav_attribute_option_value:
    - value_id: 3
      option_id: 3
      store_id: 0
      value: green
    - value_id: 4
      option_id: 4
      store_id: 0
      value: red

“color” existiert bereits als Attribut mit der ID 92 und in der eav_attribute_option Tabelle gibt es im Standard nur die Optionen mit der id 1 und 2 (“Male” und “Female” für “gender”). Dadurch dass wir in der Fixture bei ID 3 beginnen, werden diese nicht gelöscht.

Bündelprodukt (Variante 1)

eav:
  catalog_product:
    - entity_id: 1
      sku: simple-1
      type_id: simple
      attribute_set_id: 4
    - entity_id: 2
      sku: simple-2
      type_id: simple
      attribute_set_id: 4
    - entity_id: 3
      sku: simple-3
      type_id: simple
      attribute_set_id: 4
    - entity_id: 4
      sku: simple-4
      type_id: simple
      attribute_set_id: 4
    - entity_id: 5
      sku: bundle-1
      type_id: bundle
      attribute_set_id: 4
      bundle_options:
        1: [1, 2]
        2: [3, 4]

Diese Fixture erstellt ein Bündelprodukt mit zwei Auswahlen (selection_id 1 und 2), mit den einfachen Produkten 1 und 2, bzw. 3 und 4 als Optionen. Der Auswahltyp ist immer “Radio” und es ist nicht möglich, zusätzliche Einstellungen wie “Erforderlich” oder “Anzahl” festzulegen. Benötigt man diese, müssen die Bündel-Tabellen manuell gefüllt werden, siehe Variante 2:

Bündelprodukt (Variante 2)

Durch die direkte Befüllung der Bündel-Tabellen, können Bündelprodukte beliebig konfiguriert werden:

eav:
  catalog_product:
    -
      entity_id: 1
      type_id: bundle
      has_options: 1
      required_options: 1
      sku: bundle
    -
      entity_id: 2
      type_id: simple
      sku: fix
    -
      entity_id: 3
      type_id: simple
      sku: select1
    -
      entity_id: 4
      type_id: simple
      sku: select2
tables:
  bundle/option:
    -
      option_id: 1
      parent_id: 1
      required: 1
      type: checkbox
      position: 0
    -
      option_id: 2
      parent_id: 1
      required: 1
      type: select
      position: 1
    -
      option_id: 3
      parent_id: 1
      required: 0
      type: select
      position: 1
  bundle/option_value:
    -
      value_id: 1
      option_id: 1
      store_id: 1
      title: Fix
    -
      value_id: 2
      option_id: 2
      store_id: 1
      title: Select
  bundle/selection:
    -
      selection_id: 1
      option_id: 1
      parent_product_id: 1
      product_id: 2
      is_default: 1
      selection_qty: 1
    -
      selection_id: 2
      option_id: 2
      parent_product_id: 1
      product_id: 3
      is_default: 0
      selection_qty: 1
    -
      selection_id: 3
      option_id: 2
      parent_product_id: 1
      product_id: 4
      is_default: 0
      selection_qty: 1
    -
      selection_id: 4
      option_id: 3
      parent_product_id: 1
      product_id: 2
      is_default: 1
      selection_qty: 1

Gruppiertes Produkt

eav:
  catalog_product:
    - entity_id: 1
      type_id: simple
      sku: simple-1
      attribute_set_id: 4
    - entity_id: 2
      type_id: simple
      sku: simple-2
      attribute_set_id: 4
    - entity_id: 3
      type_id: grouped
      sku: set
      attribute_set_id: 4
tables:
  catalog/product_link:
    - link_id: 1
      product_id: 3
      linked_product_id: 1
      link_type_id: 3
    - link_id: 2
      product_id: 3
      linked_product_id: 2
      link_type_id: 3

Hier gibt es Stand heute (EcomDev_PHPUnit 0.3.7) keine spezielle Syntax wie bei den konfigurierbaren Produkten, so dass wir die Verknüpfung direkt über die Tabelle catalog_product_link vornehmen müssen.