2

我编写了一个模型类,它将一些 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对象上的正确方法。显然,模拟是解决这个问题的方法,但我在应该模拟什么以及如何模拟r对象方面遇到了一些困难。我承认我不熟悉模拟概念。

那么,在我的测试方法中save(),如何测试update()/insert()是否已使用正确的参数调用,以及如何为它们分配一些返回值?

4

1 回答 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")

我假设你可以从那里推断

于 2014-04-23T11:50:56.873 回答