2013-12-04 3 views
1

Я использую mock из voidspace и пытаюсь выполнить некоторые тесты, используя unittest2, и поведение странно. Когда я использую "@ patch.object (Test, 'asd')" как патч, я получаю макет объекта в аргументах функции. Если я использую @ patch.object (Test, 'asd', new_fun) как patch, я не получаю один из параметров. Я использую mock-1.0.1Проблема с заданными объектами

Здесь вы можете увидеть небольшой образец кода, который иллюстрирует проблему. Я хочу попытаться понять, является ли эта проблема проблемой с тем, как я делаю патч, или если это проблема в библиотеке.

import unittest2 as unittest 
from mock import patch 

class Test: 
    def asd(self, a, b =""): 
    print "1" 


class Test1: 
    def kk(self, l): 
     Test().asd("1") 
    def kk1(self, l): 
     Test().asd("1","1") 

@patch.object(Test,'asd') 
class MockClassUT(unittest.TestCase): 
    def test_stat_process(self, my_mock): 
     t = Test1() 
    def test_stat_process1(self, my_mock): 
     t = Test1() 
    def test_stat_process2(self, my_mock): 
     t = Test1() 


def new_fun(*args, **kwargs): 
    print "1" 


@patch.object(Test,'asd',new_fun) 
class MockClassUT1(unittest.TestCase): 
    def test_stat_process(self, my_mock): 
     t = Test1() 
     t.kk("1") 
     my_mock.assert_called_with("k") 


testloader = unittest.TestLoader() 
testnames = testloader.getTestCaseNames(MockClassUT) 
suite = unittest.TestSuite() 
for name in testnames: 
    suite.addTest(MockClassUT(name)) 

testnames = testloader.getTestCaseNames(MockClassUT1) 
for name in testnames: 
    suite.addTest(MockClassUT1(name)) 

print testnames 
unittest.TextTestRunner(verbosity=2).run(suite) 
+0

Получаем ошибку 'TypeError: test_stat_process() принимает ровно 2 аргумента (1 задано)' - это то, что вы имеете в виду? –

ответ

1

Ожидаемое поведение. Вы издевались над ним как декоратором класса, и вы также указали новую функцию new_fun. Таким образом, издевательский объект не будет передаваться каждому из методов в тестовом классе.

Это означает, что вы не можете ожидать my_mock в качестве параметра, и это также означает, что вы не можете писать утверждения, используя my_mock.

Кроме того, в качестве недостатка в вашем издеваемом методе new_fun нет такой же подписи, как метод, из которого вы издеваетесь (asd). Метод asd ожидает self, a, b="", тогда как у new_fun нет аргументов, поэтому я ожидаю, что проблема возникнет и при вызове метода издевательства.

+0

Итак, я не могу выполнить assert_called_with, когда передаю функцию макету? – jpereira

+0

@jpereira вы можете высмеивать и утверждать любым способом, но когда вы укажете 'new_fun' в инструкции патча, макет не будет передан методам тестирования. Таким образом, у вас не будет доступа к издеваемым объектам/методам. –

+0

Так что я не могу использовать assert_called_with. Мне нужно было сделать это сам внутри new_func, также исправил код, чтобы не иметь проблемы с new_fun – jpereira

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