簡體   English   中英

在Python中模擬assert_called_with

[英]Mocking assert_called_with in Python

我在理解以下代碼未通過的原因時遇到了一些麻煩:

test.py

import mock
import unittest

from foo import Foo


class TestFoo(unittest.TestCase):
    @mock.patch('foo.Bar')
    def test_foo_add(self, Bar):
        foo = Foo()
        foo.add(2, 2)
        Bar.add.assert_called_with(2, 2)


if __name__ == '__main__':
    unittest.main()

foo.py

from bar import Bar

class Foo(object):
    def add(self, x, y):
        bar = Bar()
        return bar.add(x, y)

bar.py

class Bar(object):
    def add(self, x, y):
        print('b.Bar --> Adding {} + {}'.format(x, y))
        return x + y

在代碼中, Foo.add創建一個Bar實例,並在調用時返回Bar.add的結果。 為什么測試assert_called_withBar.add失敗? 我相信我在正確的位置嘲笑Bar (我在嘲笑foo.Bar因為這是它被查找的命名空間,而不是bar.Bar )。

回溯(最近一次調用最后一次):文件“/Users/iain/PycharmProjects/testing/venv/lib/python2.7/site-packages/mock.py”,第1201行,修補返回函數(* args,** keywargs )文件“test.py”,第12行,在test_a_b中fake_Bar.add.assert_called_with(2,2)文件“/Users/iain/PycharmProjects/testing/venv/lib/python2.7/site-packages/mock.py” ,第831行,在assert_called_with中引發AssertionError('預期調用:%s \\ n不稱為'%(期望))AssertionError:預期調用:add(2,2)未調用

你正在嘲笑方法調用在正確的地方。 但是,由於您是從實例調用該方法,因此它是一個綁定方法,因此除了所有其他參數之外,還接收實例作為第一個參數( self參數)。

編輯 :由於BarMock實例替換, Bar().add不知道它是一個方法(因此沒有綁定任何東西)。 換句話說, BarMockBar()Mock ,而Bar().add也是Mock bar.add因此是一個新創建的模擬,用參數調用(2, 2) 斷言此調用的一種方法是:

@mock.patch('foo.Bar')
def test_foo_add(self, Bar):
    foo = Foo()
    foo.add(2, 2)
    Bar.return_value.add.assert_called_with(2, 2)

根據您的實際代碼的外觀,您可能希望模擬方法而不是類:

@mock.patch('foo.Bar.add')
def test_foo_add(self, bar_add):
    foo = Foo()
    foo.add(2, 2)
    bar_add.assert_called_with(2, 2)

我相信你的問題會像這樣解決:

from bar import Bar

class Foo(object):
    def add(self, x, y):
        self.bar = Bar()
        return self.bar.add(x, y)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM