在Python模型类中模拟数据库连接

2 投票
1 回答
2060 浏览
提问于 2025-04-18 03:54

我写了一个模型类,这个类把一些 RethinkDB 的功能封装成了一个对象。它的一部分代码看起来是这样的:

class Model(object):
    __metaclass__ = ModelType

    def __init__(self, **kwargs):
        self._fields = kwargs
        self._saved = False

    def save(self):
        if self._saved:
            id = self._fields.pop('id')
            result = r.table(self._tablename)
                      .get(id)
                      .update(self._fields, return_vals=True)
                      .run(self.connection())
        else:
            result = r.table(self._tablename)
                      .insert(self._fields, return_vals=True)
                      .run(self.connection())

        if result['errors'] > 0:
            raise ActionError(result['first_error'])

        self._fields = result['new_val']
        self._saved = True

现在,我想测试一下 save() 方法是否按预期工作。因为这个操作需要用到数据库连接,所以在测试之前创建和删除连接是很耗费资源的,而且没有必要,因为我只需要测试 r 对象上的正确方法是否被调用。显然,使用模拟(mocking)是解决这个问题的方法,但我在如何模拟 r 对象上遇到了一些困难。我承认我对模拟的概念还不太熟悉。

所以,在我测试 save() 的方法中,我该如何检查 update()insert() 是否被正确调用,并且我还该如何给它们指定一些返回值呢?

1 个回答

3

所以,你需要模拟 r:

r = mock.Mock()
r.table = mock.Mock(return_value=r)
r.insert = mock.Mock(return_value=r)

Model.save()

r.insert.assert_called_with("args", "you're" "expecting")

我想你可以从这里推导出其他内容

撰写回答