【问题标题】:Method Mocking in PHPUnit 9.5.2PHPUnit 9.5.2 中的方法模拟
【发布时间】:2021-06-16 16:44:11
【问题描述】:

我是在 PHP 中模拟的新手,我似乎误解了一些东西,因为我无法让基础工作:


class Klass
{
    public function a(): string
    {
        return 'a';
    }
}

class MockTest extends \PHPUnit\Framework\TestCase
{
    function testA(): void
    {
        $klass = new Klass();

        $this->assertEquals('a', $klass->a());
    }

    function testMockA()
    {
        $mock = $this->getMockBuilder(Klass::class)->getMock();

        $mock->method('a')->willReturn('foo');

        $klass = new Klass();

        $this->assertSame('foo', $klass->a());
    }
}

测试 testMockA 失败,因为 $klass->a() 仍然返回 'a'。模拟似乎什么都不做?

我以PHPUnit Mocking functions which use Database Connection 为基础,我使用了TaskTest.php 上的内容:这就是我最终想要的,模拟我的数据库类以不执行实际查询,但我无法让它工作。

【问题讨论】:

    标签: mocking phpunit


    【解决方案1】:

    您需要致电 $mock->a() 而不是 $klass->a()。事实上,你甚至不应该创建$klass

    【讨论】:

    • 我看不出创建一个模拟类并使用它有什么好处?我可以做同样的 bij 扩展它。我尝试在 PHP 中做的事情是不可能的吗?因为我正在尝试做的是测试 REST 端点的输出,而不会通过联系数据库使它们变得不必要的缓慢。
    • @RuudvanderLinden,您的示例太少,无法清楚地看到您的问题。当您想模拟数据库访问时,通常需要两个类,一个代表数据库连接,一个代表“工作人员”。然后,您可以模拟 DB 类并在测试期间为您的工作人员使用该模拟。你明白了吗?
    猜你喜欢
    • 2013-01-27
    • 2016-06-13
    • 2021-04-27
    • 1970-01-01
    • 2019-08-07
    • 2014-08-24
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多