首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Mox和Python测试模拟对象之间的调用顺序

使用Mox和Python测试模拟对象之间的调用顺序
EN

Stack Overflow用户
提问于 2010-10-26 00:37:04
回答 2查看 1.2K关注 0票数 1

我正在测试一个函数,该函数从一个辅助对象获取骨架对象,使用第二个辅助对象对其进行修改,然后将修改后的对象传递回第一个辅助对象。大致是这样的:

代码语言:javascript
复制
class ReadModifyUpdate(object):
    def __init__(self, store, modifier):
        self._store = store
        self._modifier = modifier

    def modify(key):
        record = self._store.read(key)
        self._modifier.modify(record)
        self._store.update(key, record)

使用Python和Mox,我们可以使用以下命令进行测试:

代码语言:javascript
复制
class ReadModifyUpdateTest(mox.MoxTestBase):
    def test_modify(self):
        mock_record = self.mox.CreateMockAnthing()
        mock_store = self.mox.CreateMockAnything()
        mock_modifier = self.mox.CreateMockAnything()

        mock_store.read("test_key").AndReturn(mock_record)
        mock_modifier.modify(mock_record)
        mock_store.update("test_key", mock_record)
        self.mox.ReplayAll()

        updater = ReadModifyUpdate(mock_store, mock_modifier)
        updater.modify("test_key")

...but这不会捕获在modifier.modify()之前无意中调用store.update()的错误。在Mox中,有没有一个很好的方法来检查多个mock上调用的方法的顺序?类似于EasyMock的MocksControl对象?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-26 19:04:51

来为我自己的问题提供一个答案--我目前已经通过检查调用顺序的副作用来解决这个问题。

定义助手类:

代码语言:javascript
复制
class OrderedCallSequence(object):
    def __init__(self, test_case):
        self._expectation_count = 0
        self._evaluated = 0
        self._test_case = test_case

    def assertOrder(self):
        self._expectation_count += 1
        expected_position = self._expectation_count

        def side_effect(*args, **kwargs):
            self._evaluated += 1
            self._test_case.assertEquals(self._evaluated, expected_position,
                                         msg="Invoked in incorrect sequence")
        return side_effect

...the测试用例变成:

代码语言:javascript
复制
class ReadModifyUpdateTest(mox.MoxTestBase):
    def test_modify(self):
        mock_record = self.mox.CreateMockAnthing()
        mock_store = self.mox.CreateMockAnything()
        mock_modifier = self.mox.CreateMockAnything()

        sequence = OrderedCallSequence(self)
        mock_store.read("test_key").WithSideEffects(sequence.assertOrder()).AndReturn(mock_record)
        mock_modifier.modify(mock_record).WithSideEffects(sequence.assertOrder())
        mock_store.update("test_key", mock_record).WithSideEffects(sequence.assertOrder())
        self.mox.ReplayAll()

        updater = ReadModifyUpdate(mock_store, mock_modifier)
        updater.modify("test_key")
票数 0
EN

Stack Overflow用户

发布于 2010-10-26 00:46:56

也许不是最好的解决方案,但你可以尝试使用一个模拟,你给你的对象测试两次。然后,您可以控制调用顺序。

代码语言:javascript
复制
class ReadModifyUpdateTest(mox.MoxTestBase):
    def test_modify(self):
        mock_record = self.mox.CreateMockAnthing()
        mock_storeModifier = self.mox.CreateMockAnything()

        mock_storeModifier.read("test_key").AndReturn(mock_record)
        mock_storeModifier.modify(mock_record)
        mock_storeModifier.update("test_key", mock_record)
        self.mox.ReplayAll()

        updater = ReadModifyUpdate(mock_storeModifier, mock_storeModifier)
        updater.modify("test_key")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4016798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档