Волшебная насмешка assert_called_once против assert_called_once_ со странным поведением

Я замечаю странное поведение с assert_called_once а также assert_called_once_with в питоне. Это мой настоящий простой тест:

Файловый модуль /a.py

from .b import B

class A(object):
    def __init__(self):
        self.b = B("hi")

    def call_b_hello(self):
        print(self.b.hello())

Файловый модуль /b.py

class B(object):
    def __init__(self, string):
        print("created B")
        self.string = string;

    def hello(self):
        return self.string

Это мои тесты:

import unittest
from mock import patch
from module.a import A    

class MCVETests(unittest.TestCase):
    @patch('module.a.B')   
    def testAcallBwithMockPassCorrect(self, b1):
        a = A()
        b1.assert_called_once_with("hi")
        a.call_b_hello()
        a.b.hello.assert_called_once()

    @patch('module.a.B')
    def testAcallBwithMockPassCorrectWith(self, b1):
        a = A()
        b1.assert_called_once_with("hi")
        a.call_b_hello()
        a.b.hello.assert_called_once_with()

    @patch('module.a.B')
    def testAcallBwithMockFailCorrectWith(self, b1):
        a = A()
        b1.assert_called_once_with("hi")
        a.b.hello.assert_called_once_with()

    @patch('module.a.B')
    def testAcallBwithMockPassWrong(self, b1):
        a = A()
        b1.assert_called_once_with("hi")
        a.b.hello.assert_called_once()

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

Моя проблема, как указано в названии функции:

  • Тест 1 проходит правильно
  • Тест 2 проходит правильно
  • Тест 3 не проходит правильно (я удалил вызов б)
  • Тест 4 проходит, я не уверен, почему.

Я делаю что-то неправильно? Я не уверен, но читая документацию по документам Python:

assert_called_once (* args, ** kwargs)

Утверждают, что издевательство называлось ровно один раз.

0 ответов

Это старое, но для других приземляются здесь...

assert_called_once - это не вещь, поэтому вы фактически делаете имитацию вызова функции, которая не вызывает ошибок

См.: http://engineroom.trackmaven.com/blog/mocking-mistakes/

Вместо этого вы можете проверить количество звонков

Другие вопросы по тегам