Przetwarzam sekwencję obiektów zdefiniowanych przez użytkownika. To wygląda podobnie do następującego:Jak mogę wywoływać połączenia akceptujące argumenty sekwencji za pomocą Python Mock?
class Thing(object):
def __init__(self, x, y):
self.x = x
self.y = y
Metoda Ja obecnie testuje posiada funkcje podobne do następującego:
def my_function(things):
x_calc = calculate_something(t.x for t in things)
y_calc = calculate_something(t.y for t in things)
return x_calc/y_calc
Problem jestem stoi testuje połączenia do calculate_something
. Chcę stwierdzić, że te rozmowy się stało, coś tak:
calculateSomethingMock.assert_any_call(the_sequence)
Nie dbam o kolejności sekwencji przeszedł do calculate_something
, ale nie obchodzi, że wszystkie elementy są obecne. Mógłbym zawinąć funkcję generatora w wywołaniu set
, ale nie mam ochoty, aby mój test dyktował, jaki rodzaj sekwencji został przekazany do calculate_something
. Powinienem móc przekazać mu jakąś sekwencję. Mogłem alternatywnie stworzyć metodę, która generuje sekwencję zamiast używać składni generatora i kpić z tej metody, ale to wydaje się przesadą.
Jak najlepiej sformułować to stwierdzenie, czy też moje problemy z testowaniem tutaj wskazują na słabo skonstruowany kod?
Używam Python 2.7.3 z Mock 1.0.1.
(dla każdego, kto czuje się zmuszony do wypowiedzieć się na to, że jestem świadomy robię próbę ostatni i że to nie jest uważany za największego praktyka).
Edit:
Po zegarka this marvelous talk entitled "Why You Don't Get Mock Objects by Gregory Moeck" Zastanowiłem się, czy powinienem kpić z metody calculate_something
.
Próbuję uniknąć zagłębiania się w tę listę, ale przypuszczam, że to może być jedyny sposób. Czy możesz podać przykład? – jpmc26
Dzięki. Ten test opiera się na metodzie zachowywania porządku, a także opiera się na metodzie przechodzenia na listę. Nie bardzo zależy mi na teście polegającym na zamówieniu. Jeśli zdecyduję się zmienić na inną strukturę danych dla argumentu przekazanego do 'calcul_something', czy chcę, żeby test się nie powiódł? Lub odwrotnie, jeśli zmienię test, aby sprawdzić wywołanie innego typu danych, czy chcę zmodyfikować metodę, aby ponownie go przekazać? – jpmc26
Tak, ale pamiętaj, że to jest przykład. Można przekazać 'calcul_something' dowolną inną strukturę danych, wystarczy zaktualizować test, aby to odzwierciedlić (Zmieniając oczekiwane wartości). Chcesz, żeby test przeszedł mimo wszystko. Już widziałeś, jak uzyskać argumenty przekazane do 'calcul_something' używając' call_args_list'. Później chodzi tylko o porównanie danych uporządkowanych według tego, czego oczekujesz. –