【问题标题】:mocking mongodb with phpunit用 phpunit 模拟 mongodb
【发布时间】:2020-10-25 15:18:52
【问题描述】:

我有一个使用 mongoDB 创建新文档的保存功能

public function save(User $user): User
{
    $result = $this->usersCollection->insertOne($user->getUser());
    $user->setId($result->getInsertedId());
    return $user;
}

并更改 __construct 以进行实施测试

public function __construct($db = null)
{
    if (is_null($db)) {
        parent::__construct();
    } else {
        $this->db = $db;
    }

    $this->usersCollection = $this->db->users;
}

我为保存功能编写了这个测试

public function testSave()
{
    $mongo = \Mockery::mock('MongoDB\Client');
    $mongo->shouldReceive('insertOne')->andReturn("ok");
    $mongo->shouldReceive('selectDatabase')->andReturnSelf();

    $user = new User('jack', '0015005050');
    $um = new UserMongoDB($mongo);
    $res = $um->save($user);
}

一切正常,但我的问题是$result->getInsertedId() 如何模拟此功能?

错误:在字符串上调用成员函数 getInsertedId()

【问题讨论】:

    标签: php mongodb phpunit mockery


    【解决方案1】:

    insertOne 方法的返回类型必须是InsertOneResult 的实例(请参阅docs)。目前您正在返回字符串“ok”。你可以继续让insertOne 返回InsertOneResult 的模拟。这可能有效,但你正处于嘲笑地狱的大门。就个人而言,我会为 save 方法编写集成测试。在其他单元测试中模拟 save 方法比到处模拟低级 MongoDB 的东西要容易得多。

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 1970-01-01
      • 2020-05-08
      • 2013-07-29
      • 2017-04-16
      • 2014-11-07
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多