【问题标题】:Codecoverage phpunit test issue代码覆盖 phpunit 测试问题
【发布时间】:2021-02-08 13:10:02
【问题描述】:

我正在运行 phpunit 9.2 版,我想知道为什么我的方法不在 phpunit 覆盖范围内。

这是我的课:

class Methods extends Template
{

    const DISABLED_PAYMENT_METHODS_1 = 'free';
    const DISABLED_PAYMENT_METHODS_2 = 'adyen_cc';
    const DISABLED_PAYMENT_METHODS_3 = 'adyen_oneclick';

    protected $paymentMethodList;

    protected $storeManager;

    protected $logger;

    public function __construct(
        Context $context,
        PaymentMethodList $paymentMethodList,
        StoreManagerInterface $storeManager,
        LoggerInterface $logger,
        array $data = []
    ) {
        $this->paymentMethodList = $paymentMethodList;
        $this->storeManager = $storeManager;
        $this->logger = $logger;
        parent::__construct($context, $data);
    }

    public function getPaymentMethods()
    {
        try {
            $storeId = $this->storeManager->getStore()->getId();
            $paymentList = $this->paymentMethodList->getActiveList($storeId);
            $resultPayments = [];

            foreach ($paymentList as $payment) {
                if ($payment->getCode() !== self::DISABLED_PAYMENT_METHODS_1 &&
                    $payment->getCode() !== self::DISABLED_PAYMENT_METHODS_2 &&
                    $payment->getCode() !== self::DISABLED_PAYMENT_METHODS_3
                ) {
                    $resultPayments[] = $payment;
                }
            }

            return $resultPayments;
        } catch (Exception $e) {
            $this->logger->error($e->getMessage());
            return false;
        }
    }
}

这是我的测试课:

class MethodsTest extends TestCase
{

    private $model;


    private function getSimpleMock($originalClassName)
    {
        return $this->getMockBuilder($originalClassName)
            ->disableOriginalConstructor()
            ->getMock();
    }

    public function setUp() : void
    {
        $context = $this->getSimpleMock(Context::class);
        $paymentMethodList = $this->getSimpleMock(PaymentMethodList::class);
        $storeManager = $this->getSimpleMock(StoreManagerInterface::class);
        $logger = $this->getSimpleMock(LoggerInterface::class);

        $this->model = new Methods(
            $context,
            $paymentMethodList,
            $storeManager,
            $logger,
            []
        );
    }

    public function testGetPaymentMethods()
    {
        $stub = $this->createMock(Methods::class);
        $stub->method('getPaymentMethods')
            ->willReturn([]);
        try {
            $stub->getPaymentMethods();
            $this->fail("Expected exception!");
        } catch (\Exception $error) {
            $this->assertEquals("Expected exception!", $error->getMessage());
        }
    }
}

当我运行命令以获取覆盖率时。我正进入(状态:

我真的很好奇为什么我的测试没有被覆盖或者至少是异常部分?请你分享你的想法为什么?我该怎么做才能解决这个问题?现在我得到了 29% 的覆盖率,我希望得到至少 60% 的覆盖率。

谢谢

【问题讨论】:

  • 您的测试方法为该方法创建了一个模拟,因此运行的是模拟方法。

标签: php phpunit code-coverage


【解决方案1】:

在这一行 $stub = $this->createMock(Methods::class); 上,您正在创建 Methods 类的模拟,因此实际上并未测试真正的类。

您将需要使用您在 setUp() 方法中创建的对象,并为您传入的依赖项设置模拟返回(可能将其中一些转换为类属性)。

【讨论】:

  • 好的,但是有什么线索可以在不使用模拟的情况下做到这一点吗?它也是关于依赖注入
  • 嗨@Dezza,谢谢更新你的帖子,但如果你能给我一个链接或一个例子,我该怎么做,我将不胜感激
【解决方案2】:

你应该测试真实的类,例如:

public function testGetPaymentMethods()
{
    // define a payment
    $paymentFreeCode = $this->createMock(Payment::class);
    $paymentFreeCode->method('getcode')
        ->willReturn("free");

    // define a payment
    $payment = $this->createMock(Payment::class);
    $payment->method('getcode')
        ->willReturn("invalid-code");

    $paymentList = [
        $paymentFreeCode,
        $payment,
    ];

    // define a store
    $store = $this->createMock(Store::class);
    $store->method('getId')
        ->willReturn("my-store-id");

    // return store from the store manager
    $this->storeManager->method('getStore')
        ->willReturn(myStore);

    // return the payment list
    $this->paymentMethodList->method('getActiveList')->with("my-store-id")
        ->willReturn($paymentList);

    // call the real class instrumented with mocks
    $paymentMethods = $this->model->getPaymentMethods();

    $this->assertIsArray($paymentMethods);
    $this->assertCount($paymentMethods, 1);
}

【讨论】:

    猜你喜欢
    • 2015-02-09
    • 2012-01-18
    • 2013-04-16
    • 2012-05-04
    • 2017-04-30
    • 2020-04-29
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多