Magento PHPUnit Testing с модулем EcomDev, выдает ошибку SQL при вставке элементов счета - PullRequest
2 голосов
/ 20 января 2012

У меня есть YAML для данных счета-фактуры, которые необходимо ввести в базу данных тестирования:

После данных Scope для веб-сайта, данных клиента, данных продукта и данных заказа, есть данные счета-фактуры иЯ вставлю только этот бит.

Все работает нормально с точки зрения настройки данных, вплоть до вставки данных счета, когда я удаляю данные позиций счетов.Как только я добавляю данные элементов счета-фактуры, он дает мне следующую ошибку в выполнении SQL, которая не может быть правильной, так как данные были действительными, когда я экспортировал их из MySQL в YAML.

Ошибка:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`xxxx_unit_tests`.`sales_flat_invoice_item`, CONSTRAINT `FK_SALES_FLAT_INVOICE_ITEM_PARENT` FOREIGN KEY (`parent_id`) REFERENCES `sales_flat_invoice` (`entity_id`) ON DELETE CASCADE ON UPDATE)

Я снова проверил данные счета-фактуры, чтобы убедиться, что все правильно, и увидел, что там была вторая запись, а не первая, но при создании данных счета-фактуры не было выдано никаких ошибок, и, следовательно, причина дляпредыдущая ошибка, поскольку не было счета-фактуры с entity_id, равным 1.

Мне нужно знать, почему обнаруживалась вторая строка, а не первый набор данных, с entity_id, равным 1 для счетов-фактур.

Кто-нибудь еще сталкивался с этой проблемой?когда я оставляю только один набор данных счета-фактуры и один набор данных элемента счета-фактуры, тогда он работает.

tables:
  sales/invoice:
    - entity_id: 1
      store_id: 99
      base_grand_total: 20.0000
      shipping_tax_amount: 0.0000
      tax_amount: 0.0000
      base_tax_amount: 0.0000
      store_to_order_rate: 1.0000
      base_shipping_tax_amount: 0.0000
      base_discount_amount: 0.0000
      base_to_order_rate: 1.0000
      grand_total: 20.0000
      shipping_amount: 0.0000
      subtotal_incl_tax: 20.0000
      base_subtotal_incl_tax: 20.0000
      store_to_base_rate: 1.0000
      base_shipping_amount: 0.0000
      total_qty: 1.0000
      base_to_global_rate: 1.0000
      subtotal: 20.0000
      base_subtotal: 20.0000
      discount_amount: 0.0000
      billing_address_id: 1
      order_id: 1
      state: 1
      store_currency_code: "USD"
      order_currency_code: "USD"
      base_currency_code: "USD"
      global_currency_code: "USD"
      increment_id: 200009925
      created_at: "2012-01-19 23:40:27"
      updated_at: "2012-01-19 23:40:27"
      hidden_tax_amount: 0.0000
      base_hidden_tax_amount: 0.0000

    - entity_id: 2
      store_id: 99
      base_grand_total: 20.0000
      shipping_tax_amount: 0.0000
      tax_amount: 0.0000
      base_tax_amount: 0.0000
      store_to_order_rate: 1.0000
      base_shipping_tax_amount: 0.0000
      base_discount_amount: 0.0000
      base_to_order_rate: 1.0000
      grand_total: 20.0000
      shipping_amount: 0.0000
      subtotal_incl_tax: 20.0000
      base_subtotal_incl_tax: 20.0000
      store_to_base_rate: 1.0000
      base_shipping_amount: 0.0000
      total_qty: 1.0000
      base_to_global_rate: 1.0000
      subtotal: 20.0000
      base_subtotal: 20.0000
      discount_amount: 0.0000
      billing_address_id: 1
      order_id: 2
      state: 2
      store_currency_code: "USD"
      order_currency_code: "USD"
      base_currency_code: "USD"
      global_currency_code: "USD"
      increment_id: 200009925
      created_at: "2012-01-19 23:40:27"
      updated_at: "2012-01-19 23:40:27"
      hidden_tax_amount: 0.0000
      base_hidden_tax_amount: 0.0000

  sales/invoice_item:
    - entity_id: 1
      parent_id: 1
      base_price: 20.0000
      base_weee_tax_row_disposition: 0.0000
      weee_tax_applied_row_amount: 0.0000
      base_weee_tax_applied_amount: 0.0000
      base_row_total: 20.0000
      row_total: 20.0000
      weee_tax_row_disposition: 0.0000
      base_weee_tax_disposition: 0.0000
      price_incl_tax: 20.0000
      weee_tax_applied_amount: 0.0000
      base_price_incl_tax: 20.0000
      qty: 1.0000
      weee_tax_disposition: 0.0000
      base_weee_tax_applied_row_amount: 0.0000
      price: 20.0000
      base_row_total_incl_tax: 20.0000
      row_total_incl_tax: 20.0000
      product_id: 1
      order_item_id: 1
      weee_tax_applied: "a:0:{}"
      sku: "gift"
      name: "Test Giftcard"

    - entity_id: 2
      parent_id: 2
      base_price: 20.0000
      base_weee_tax_row_disposition: 0.0000
      weee_tax_applied_row_amount: 0.0000
      base_weee_tax_applied_amount: 0.0000
      base_row_total: 20.0000
      row_total: 20.0000
      weee_tax_row_disposition: 0.0000
      base_weee_tax_disposition: 0.0000
      price_incl_tax: 20.0000
      weee_tax_applied_amount: 0.0000
      base_price_incl_tax: 20.0000
      qty: 1.0000
      weee_tax_disposition: 0.0000
      base_weee_tax_applied_row_amount: 0.0000
      price: 20.0000
      base_row_total_incl_tax: 20.0000
      row_total_incl_tax: 20.0000
      product_id: 1
      order_item_id: 2
      weee_tax_applied: "a:0:{}"
      sku: "gift"
      name: "Test Giftcard"

У меня заканчиваются идеи относительно причин этой проблемы

1 Ответ

4 голосов
/ 23 января 2012

Выяснил, в чем проблема.

Это было вызвано одной вещью, но ошибка указала на что-то другое. Гадкий гоча.

Проблемным дочерним элементом был второй счет-фактура, имеющий тот же инкремент_идентификатора. Когда данные добавляются в тестовую базу данных, она выполняет оператор insert / update_on_duplicate, который сделал что-то совершенно странное.

try {
    $this->_getWriteAdapter()->insertOnDuplicate(
         $this->getTable($tableEntity),
         $records
    );
} catch (Exception $e) {
    throw new EcomDev_PHPUnit_Model_Mysql4_Fixture_Exception(
        sprintf('Unable to insert/update records for a table "%s"', $tableEntity), 
        $e
    );
}

Первый счет был вставлен без каких-либо проблем, и когда он подошел к точке вставки второго счета, он понял, что поле increment_id, в котором указан уникальный индекс, такое же, как и в первом счете, а затем использовал данные из второго счета и обновил первую вставленную запись с этими данными.

Второй счет-фактура имел entity_id, равный «2», так что он затем стал entity_id первой вставленной записи и выглядел так, как будто были вставлены только вторые данные счета-фактуры, а не первые данные счета-фактуры.

Когда он добрался до точки, в которую вставлялись элементы счетов-фактур, ошибка "Нарушение ограничения целостности" была помечена за кулисами, где я проследил ее, так как не было счета-фактуры с entity_id "1" в базы данных, чтобы связать дочерний элемент с, так как его entity_id его родителя был обновлен до "2".

Возможно, часть вставки «Обновление по дубликатам» должна быть отключена, если вы знаете, что не собираетесь обновлять данные в тесте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...