This small PHPSpec extension allows you to test Magento 2.0 modules much more easier by utilizing generators of Magento\Framework\ObjectManager
.
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.
- Factory
- Repository
- Converter
- Persistor
- Mapper
- SearchResults
-
Install via composer
composer require --dev ecomdev/phpspec-magento-di-adapter
-
Add to your phpspec.yml
extensions: - EcomDev\PHPSpec\MagentoDiAdapter\Extension
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();
}
}
Make a pull request based on develop branch