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?

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.


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();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.