首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建返回self mock的mock和stub方法

创建返回self mock的mock和stub方法
EN

Stack Overflow用户
提问于 2020-11-14 08:22:01
回答 1查看 308关注 0票数 1

我有一个如下的类:

代码语言:javascript
复制
class Foo extends BaseObject {

    public static function grab() {
        // do some DB search and return an instance of self
        // with the data in the object
        return new Foo($id);
    }

    public function insert() {
        // insert the data in the database for this object
        return false;
    }

    public function delete() {
        // delete the data from the database for this object
        return false;
    }

}

我如何模拟这个对象,同时仍然能够断言对insertdelete的调用按预期运行?

我所做的是:use AspectMock\Test;

代码语言:javascript
复制
    $mock = Test::double('Foo', [
        'grab' => Stub::make('Foo'),
        'insert' => true,
        'delete' => true,
    ]);

    // ... later in the test ...

    self::assertSame($foo->insert(), true);

    $mock->verifyInvoked('insert', 1);

这将绕过insertupdate方法的模拟,返回false而不是预期的true。它也没有像预期的那样计算调用次数。

那么我怎样才能让mock自动返回呢?

(请原谅我在mockstub之间造成的任何混淆)

EN

回答 1

Stack Overflow用户

发布于 2020-11-16 18:59:11

我建议您使用Phake来模拟静态方法as described here in the doc,例如:

代码语言:javascript
复制
public function testInsert()
{
    /** @var \App\Foo $classUnderTest */
    $classUnderTest = $this->getMockBuilder(Foo::class)
        ->disableOriginalConstructor()
        ->onlyMethods(['insert'])
        ->getMock();

    $classUnderTest->expects($this->once())
        ->method('insert')
        ->willReturn(true);

    /** @var \App\Foo $fooGrab */
    $fooGrab = \Phake::mock(Foo::class);
    \Phake::whenStatic($fooGrab)
        ->grab()
        ->thenReturn($classUnderTest);

    $mock = $fooGrab::grab();

    $this->assertTrue($mock->insert());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64829677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档