繁体   English   中英

Python补丁模拟似乎已被调用,但断言失败

[英]Python patch mock appears to be called, but assert fails

我正在使用Python 2.6.6

我正在尝试用模拟代替对象的创建,以确保进行正确的调用。 应该很简单。

我的模块:

import dir.SubModule

class Cls( object ):
    def Start( self ):
        self.__obj = dir.SubModule.SubCls()
        self.__obj.foo()

我的测试:

import MyModule
import unittest
from mock import Mock, MagicMock, patch

class MyTest( unittest.TestCase ):
    def setUp( self ):
        self.uut = MyModule.Cls()

    def test_one( self ):
        with patch( 'dir.SubModule.SubCls', spec=True ) as mockObj:
            print "mock calls before"
            print mockObj.mock_calls
            self.uut.Start()

            print "called: "      + str( mockObj.called )
            print "foo called: " + str( mockObj.foo.called )
            print "call_count: "  + str( mockObj.call_count )
            print "call_args: "   + str( mockObj.call_args )
            print "args_list: "   + str( mockObj.call_args_list )
            print "mock calls:\n" + str( mockObj.mock_calls )
            print "method calls:\n " + str( mockObj.method_calls )

输出为:

mock calls before:
[]
called: True
foo called: False
call_count: 1
call_args: call()
args_list: [call()]
mock calls:
[call(), call().foo()]
method calls:
[]

但是测试失败:

AssertionError: Expected call: foo()
Not called

我不知道该模拟程序如何报告已进行了调用,但是我无法断言它们已被调用。 我想念什么?

编辑:在添加了所有指标的报告后,似乎对Python模拟存在一些误解。 如果foo()在调用列表中,那么为什么调用仅计数为1,为什么foo.call报告为'False'?

在此测试中永远不会调用mockObj.foo self.uut.Start()调用mockObj ,创建一个新的模拟,然后调用该模拟的 foo方法。 如果要断言此调用已发生,则需要访问正确的对象:

mockObj.return_value.foo.assert_called_with()

这里是链接: 链接

我的简单修复:

with patch( 'class' ) as mockCreator:
    mockObj = mockCreator.return_value

然后,我可以使用'mockObj'willy-nilly。

上周,当我第一次学习模拟时,我遇到了链接的解决方案-为时过早,以至于信息无法完全吸收。

模拟断言语法有很多怪癖。 为了处理它,我编写了一个帮助程序库来为我生成断言。

这是您将其用于测试方法的方式:

import MyModule
import unittest
from mock import patch

class MyTest( unittest.TestCase ):
    def setUp( self ):
        self.uut = MyModule.Cls()

    def test_one( self ):
        with patch( 'dir.SubModule.SubCls', spec=True ) as mockObj:
            self.uut.Start()

            # calls to generate_asserts, put this after the 'act'
            import mock_autogen.generator
            print(mock_autogen.generator.generate_asserts(mockObj))

您得到的输出是:

assert 1 == mockObj.call_count
mockObj.assert_called_once_with()
mockObj.return_value.foo.assert_called_once_with()

__init__调用相关,然后与新创建对象的foo调用相关。

因此,您无需再亲自找出确切的语法,只需应用该工具即可:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM