单元测试-在Python中模拟Model类中的数据库连接



我已经编写了一个Model类,它将一些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()是否使用正确的参数进行了调用,以及如何为它们分配一些返回值?

因此,您需要模拟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")

我假设你可以从那里推断

最新更新