Волшебная насмешка 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/
Вместо этого вы можете проверить количество звонков