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

Pfu*_*Guy 0 python unit-testing python-unittest python-unittest.mock

我正在使用 Python 2.6.6

我想要做的是用 Mock 替换对象的创建,以确保进行正确的调用。应该是直截了当的。

我的模块:

import dir.SubModule

class Cls( object ):
    def Start( self ):
        self.__obj = dir.SubModule.SubCls()
        self.__obj.foo()
Run Code Online (Sandbox Code Playgroud)

我的测试:

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 )
Run Code Online (Sandbox Code Playgroud)

输出是:

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

然而测试失败了:

AssertionError: Expected call: foo()
Not called
Run Code Online (Sandbox Code Playgroud)

我不知道模拟如何报告已进行调用,但我不能断言它们已被调用。我错过了什么?

编辑:添加所有指标的报告后,似乎我对 python 模拟有一些基本的误解。如果 foo() 在调用列表中,那么为什么调用计数只有 1,为什么 foo.called 报告“假”?

use*_*ica 6

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

mockObj.return_value.foo.assert_called_with()
Run Code Online (Sandbox Code Playgroud)