2017-02-21 47 views
0

У меня есть класс Джанго подмешать с несколькими методами, кодируемых, как в следующих простой пример:Тестов сколько вызовов методы произошли и какие аргументы пропускали (тест Джанго Mixin класс)

class Mixin(object): 
    def method1(self): 
     A = self.A # this is dictionary 
     B = self.B 
     C = self.C 
     D = self.D 

     for i,j in self.A.iteritems(): 
      self.method2(B, C, D, i, j) 

    def method2(self, arg1, arg2, arg3, arg4, arg5): 
     pass 

декларация Mixin класс не обеспечивают любой из аргументов A, B, C, D. Они будут указаны в классе вида.

Я хочу проверить поведение метода1 и проверить, сколько вызовов метода2 и какие аргументы были переданы в каждом вызове.

Буду признателен за любую идею, как я могу справиться с этой проблемой.

Заранее благодарен!

ответ

2

Вы можете сделать это довольно просто с помощью библиотеки mock. Вы можете исправить ваш просмотр под тестом, чтобы заменить method2 макету, а затем использовать атрибут calls_list или различные методы assert_called_.

@mock.patch('MyViewClass.method2') 
def test_method2_calls(self, patched_method): 
    ... thing that calls method1 ... 
    patched_method.assert_called_with('A') # or whatever 
0

Это можно сделать с помощью декоратора. Упрощенный пример:

from types import MethodType 

class MonitorMethod(object): 
    def __init__(self, func): 
     self.ncalled = 0 
     self.whichargs = [] 
     self.func = func 

    def __call__(self, *args, **kwargs): 
     self.ncalled += 1 
     # This could be done much prettier with inspect.Signature and signature.bind 
     self.whichargs.append((args, kwargs)) 
     return self.func(*args, **kwargs) 

    def __get__(self, instance, cls): 
     return self if instance is None else MethodType(self, instance) 


class MyClass(object): 
    # decorate method 
    @MonitorMethod 
    def mymethod(self, A, B, C, D, E): 
     return A + B + C + D + E 

Например:

>>> instance = MyClass() 
>>> instance.mymethod(1,2,3,4,5) 
>>> instance.mymethod(1,2,E=3,D=4,C=5) 
>>> instance.mymethod.ncalled 
2 
>>> instance.mymethod.whichargs 
[((<__main__.MyClass at 0x2da1ea41080>, 1, 2, 3, 4, 5), {}), 
((<__main__.MyClass at 0x2da1ea41080>, 1, 2), {'C': 5, 'D': 4, 'E': 3})] 

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