在Python模型类中模拟数据库连接
我写了一个模型类,这个类把一些 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")
我想你可以从这里推导出其他内容