模拟测试特征和模拟方法

Posted

技术标签:

【中文标题】模拟测试特征和模拟方法【英文标题】:Mockery test trait and mock method 【发布时间】:2020-04-12 06:39:54 【问题描述】:

我尝试使用两种方法对特征进行单元测试。我想断言 foo 的结果,它在 trait 中调用另一个方法:

<?php
trait Foo 
    public function foo() 
        return $this->anotherFoo();
    

    public function anotherFoo() 
        return 'my value';
    


/** @var MockInterface|Foo */
$mock = Mockery::mock(Foo::class);
$mock
    ->makePartial()
    ->shouldReceive('anotherFoo')
    ->once()
    ->andReturns('another value');

$this->assertEquals('another value', $mock->foo());

我在运行phpunit 时得到以下结果:

There was 1 failure:

1) XXX::testFoo
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'another value'
+'my value'

这样一般可以吗?

【问题讨论】:

【参考方案1】:

我认为你不能直接嘲笑这样的特质。似乎可行的是做同样的事情,但使用一个使用该特征的类。因此,例如,创建一个使用Foo 的测试Bar 类,然后对that 进行部分模拟。这样你就可以使用一个真正的类,而 Mockery 似乎很乐意覆盖 trait 方法。

trait Foo 
    public function foo() 
        return $this->anotherFoo();
    

    public function anotherFoo() 
        return 'my value';
    


class Bar 
    use Foo;


/** @var MockInterface|Bar */
$mock = Mockery::mock(Bar::class);
$mock
    ->makePartial()
    ->shouldReceive('anotherFoo')
    ->once()
    ->andReturns('another value');

$this->assertEquals('another value', $mock->foo());

【讨论】:

以上是关于模拟测试特征和模拟方法的主要内容,如果未能解决你的问题,请参考以下文章

使用模拟对象(Mock Object)技术进行测试驱动开发

使用proxyquire和mocha在单元测试中模拟方法调用时如何模拟时间延迟(超时)?

我们可以在模拟器中测试 Face ID 吗?

测试 Vue 组件 - 模拟状态和方法

模拟测试和PHP的魔法__get方法

C#:在密封类中模拟和测试受保护(或私有)方法——方法