0

Я использую Python 2.6.6Python патч макет, кажется, называется, но утверждают, терпит неудачу

То, что я пытаюсь сделать, это заменить создание объекта с Мок, чтобы убедиться, что правильно звонки. Должно быть просто.

Мой модуль:

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 

Я не понимаю, как макет может сообщить, что были сделаны вызовы, но я не могу утверждать, что они были вызваны. Что мне не хватает?

EDIT: После добавления отчетов о всех показателях, кажется, есть что-то фундаментальное, что я не понимаю, что такое python mocks. Если foo() находится в списке вызовов, то почему счетчик вызовов только 1, и почему foo.called report «False»?

+0

коде вы опубликовали, кажется, не соответствует коду на самом деле достаточно хорошо для нас, чтобы помочь вам. Похоже, что код, который вы опубликовали, имеет совершенно другой набор ошибок. – user2357112

+0

Единственная ошибка, которую я обнаружил, заключалась в том, что мне не хватало объявления setUp() перед моим созданием объекта uut; в противном случае это код, который я запускаю, за исключением того, что я удалил другой ненужный объект и создание и использование переменных (что я доказал, потому что он закомментирован в моем коде.) – PfunnyGuy

ответ

2

mockObj.foo никогда не вызывается в этом тесте. self.uut.Start() вызывает mockObj, создавая новый макет, а затем называет тем, что mock'sfoo метод. Если вы хотите, чтобы утверждать, что этот вызов произошло, вам нужно будет получить доступ правильный объект:

mockObj.return_value.foo.assert_called_with() 
+0

Ah! Я читал о чем-то подобном в другой статье. Мне нужно найти это и связать его, у него было довольно хорошее объяснение! Благодаря! – PfunnyGuy

0

Вот ссылка: link

Моя простая ошибка:

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

Тогда я может использовать «mockObj» волей-неволей.

я натыкался связанным решением на прошлой неделе, когда я был первым узнавать о издевается. - немного слишком рано для информации достаточно погрузить в

Смежные вопросы