Làm thế nào để giả định một đối tượng bối cảnh


8

Tôi đang cố gắng kiểm tra một mô-đun có chứa một đối tượng bối cảnh như sau:

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

Khi tôi chạy Kiểm tra đơn vị, nó sẽ cho tôi thông báo lỗi này:

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

Làm cách nào tôi có thể tạo bản giả của đối tượng này hoặc sửa lỗi này?

Câu trả lời:


7

Bạn có thể kiểm tra lớp của bạn như thế này:

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
}

Bạn có thể di chuyển tất cả các tòa nhà giả sang setUp()phương thức nếu bạn cần thực hiện nhiều hơn 1 thử nghiệm.


Cảm ơn bạn đã trả lời tuyệt vời! nhưng tôi vẫn không thể chế nhạo getSku () như bạn đã đề cập trong mã. vì vậy tôi đăng nó ở đây: magento.stackexchange.com/questions/122785/, bạn có thể vui lòng giúp tôi trả lời không? cảm ơn trước
Amin Memariani

3

Đoạn mã sau sẽ tạo ra một bản mô tả bối cảnh trong bài kiểm tra của bạn.

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

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

Sau đó, bạn sẽ cần sử dụng pass $contextMockthông qua trình quản lý đối tượng:

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

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

Hoặc bạn có thể sử dụng Mock và truyền đối số nếu bạn cần thay đổi đầu ra phương thức của lớp bạn đang thay đổi:

$objectToTest = $this->getMockBuilder(\Magento\Class\To\Test::class)
    ->setConstructorArgs([
        'context' => $contextMock
    ])->getMock();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.