So verspotten Sie ein Kontextobjekt

8

Ich versuche ein Modul zu testen, das ein Kontextobjekt wie folgt enthält:

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;
}

Wenn ich meinen Unit Test durchführe, wird folgende Fehlermeldung angezeigt:

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 ...

Wie kann ich dieses Objekt verspotten oder diesen Fehler beheben?

Amin Memariani
quelle

Antworten:

7

Sie können Ihre Klasse folgendermaßen testen:

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
}

Sie können das gesamte Scheingebäude in die setUp()Methode verschieben, wenn Sie mehr als einen Test durchführen müssen.

Marius
quelle
Vielen Dank für die tolle Antwort! aber ich kann mich immer noch nicht über getSku () lustig machen, wie Sie im Code erwähnt haben. Also poste ich es hier: magento.stackexchange.com/questions/122785/… Kannst du mir bitte einen Gefallen tun, um das auch zu beantworten?
Vielen
3

Der folgende Code erstellt ein Modell des Kontexts in Ihrem Test.

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

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

Sie müssen dann den Pass $contextMocküber den Objektmanager verwenden:

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

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

Oder Sie können einen Mock verwenden und das Argument übergeben, wenn Sie die Methodenausgabe der Klasse ändern müssen, die Sie ändern:

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