ecomdev / phpspec-magento-di-adapter
An adapter for DI features of Magento\Framework to write easier your examples with PHPSpec. Does not use ObjectManager, only emulates some of its features
Requires
- php: ~5.6|~7.0
- magento/framework: ~100.0
- mikey179/vfsstream: ^1.6
- zendframework/zend-code: ~2.4.6
- zendframework/zend-stdlib: ~2.4.6
Requires (Dev)
This package is auto-updated.
Last update: 2024-10-27 22:01:27 UTC
README
This small PHPSpec extension allows you to test Magento 2.0 modules much more easier by utilizing generators of Magento\Framework\ObjectManager
.
Why?
Reasons why not to use ObjectManager
in PHPSpec examples:
- It is heavy and requires stubbing full file system in order to run a simple spec example.
- Depending on ObjectManager is a bad idea, as you don't want to test some-else DI overrides.
- Simple modules that do not require database do not need fully functional object manager
- Adapting your business logic to another framework will require from you only to materialize generated classes, instead of depending on the whole ObjectManager library.
Supported Generators
- Factory
- Repository
- Converter
- Persistor
- Mapper
- SearchResults
Installation
-
Install via composer
composer require --dev ecomdev/phpspec-magento-di-adapter
-
Add to your phpspec.yml
extensions: - EcomDev\PHPSpec\MagentoDiAdapter\Extension
Usage
Make sure that when you write examples to specify fully qualified class name for auto-generated class.
<?php namespace spec\Acme\CustomMagentoModule\Model; use Magento\Catalog\Model\Product; use PhpSpec\ObjectBehavior; use Prophecy\Argument; class ProductManagerSpec extends ObjectBehavior { private $productFactory; function let(ProductFactory $factory) { $this->productFactory = $factory; $this->beConstructedWith($factory); } function it_creates_items_via_product_factory(Product $product) { $this->productFactory->create()->willReturn($product)->shouldBeCalled(); $this->someCreationLogic(); } }
This approach will not get you a desired result, as PHP by default looks for undefined classes within the same namespace.
So instead of Magento\Catalog\Model\ProductFactory
it will generate a class spec\Acme\CustomMagentoModule\Model\ProductFactory
, that is definitely not a desired behavior.
In order to fix that make sure to specify fully qualified name in method signature or via use
operator in the file header.
<?php namespace spec\Acme\CustomMagentoModule\Model; use Magento\Catalog\Model\Product; use Magento\Catalog\Model\ProductFactory; // This class will be automatically generated use PhpSpec\ObjectBehavior; use Prophecy\Argument; class ProductManagerSpec extends ObjectBehavior { private $productFactory; function let(ProductFactory $factory) { $this->productFactory = $factory; $this->beConstructedWith($factory); } function it_creates_items_via_product_factory(Product $product) { $this->productFactory->create()->willReturn($product)->shouldBeCalled(); $this->someCreationLogic(); } }
Contribution
Make a pull request based on develop branch