Como zombar de um objeto de contexto

8

Estou tentando testar um módulo que contém um objeto de contexto da seguinte maneira:

public function __construct(
    \Magento\Framework\App\Helper\Context $context,
    \Magento\Catalog\Model\Product\ImageFactory $productImageFactory,
    \Magento\Framework\View\Asset\Repository $assetRepo,
    \Magento\Framework\View\ConfigInterface $viewConfig,
    ProductRepository $productRepo
)
    {
    parent::__construct($context, $productImageFactory, $assetRepo, $viewConfig);
    $this->productRepo = $productRepo;
}

Quando executo meu teste de unidade, ele me envia esta mensagem de erro:

PHPUnit_Framework_Error : Argument 1 passed to Magento\Catalog\Model\Product::__construct() must be an instance of Magento\Framework\Model\Context, none given, called in ...

Como posso zombar desse objeto ou corrigir esse erro?

Amin Memariani
fonte

Respostas:

7

Você pode testar sua turma assim:

public function testSomething() 
{
    $contextMock = $this->getMockBuilder(\Magento\Framework\App\Helper\Context::class)
         ->disableOriginalConstructor()
         ->getMock();
    $productImageFactoryMock = $this->getMockBuilder(\Magento\Catalog\Model\Product\ImageFactory::class)
         ->disableOriginalConstructor()
         ->getMock();
    $assetRepoMock = $this->getMockBuilder(\Magento\Framework\View\Asset\Repository::class)
         ->disableOriginalConstructor()
         ->getMock();
    $viewConfigMock = $this->getMockBuilder(\Magento\Framework\View\ConfigInterface::class)
         ->disableOriginalConstructor()
         ->getMock();
    $productRepoMock = $this->getMockBuilder(\Magento\Catalog\Model\ProductRepository::class)
         ->disableOriginalConstructor()
         ->getMock();

    $productImageMock = $this->getMockBuilder(\Magento\Catalog\Model\Product\Image::class)
         ->disableOriginalConstructor()
         ->getMock();

    //mock here any methods you need to mock

    $productImageFactoryMock->method('create')->willReturn($productImageMock); 

    $model = new \The\Class\You\Want\To\Test( 
               $contextMock,
               $productImageFactoryMock,
               $assetRepoMock,
               $viewConfigMock,
               $productRepoMock
    ); 
    //do asserts here
}

Você pode mover toda a construção simulada para o setUp()método se precisar fazer mais de um teste.

Marius
fonte
Obrigado pela ótima resposta! mas ainda não consigo zombar do getSku () como você mencionou no código. então eu posto aqui: magento.stackexchange.com/questions/122785/… você pode me fazer um favor para responder isso também? obrigado antecipadamente
Amin Memariani
3

O código a seguir criará uma simulação do contexto em seu teste.

    $contextMock = $this->getMockBuilder(\Magento\Framework\App\Helper\Context::class)
        ->disableOriginalConstructor()
        ->getMock();

De: vendor/magento/module-sales/Test/Unit/Helper/DataTest.php:setup()

Você precisará usar o passe $contextMockatravés do gerenciador de objetos:

$objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);

$objectToTest = $objectManager->getObject(
        \Magento\Class\To\Test::class, [
            'context' => $contextMock,
            ...
        ]
    );

Ou você pode usar um Mock e passar o argumento se precisar alterar a saída do método da classe que está sendo alterada:

$objectToTest = $this->getMockBuilder(\Magento\Class\To\Test::class)
    ->setConstructorArgs([
        'context' => $contextMock
    ])->getMock();
jzahedieh
fonte