Mam klasę, którą testuję, która ma jako zależność inną klasę (której wystąpienie zostaje przekazane do metody init CUT). Chcę wyśmiewać tę klasę przy użyciu biblioteki Python Mock.Python Mock object z metodą o nazwie multiple time
Co mam coś takiego jak:
mockobj = Mock(spec=MyDependencyClass)
mockobj.methodfromdepclass.return_value = "the value I want the mock to return"
assertTrue(mockobj.methodfromdepclass(42), "the value I want the mock to return")
cutobj = ClassUnderTest(mockobj)
co jest w porządku, ale „methodfromdepclass” jest metodą parametryzowane i jako takie Chcę utworzyć jeden atrapa obiektu, gdzie w zależności od tego, co argumenty są przekazywane do methodfromdepclass zwraca różne wartości.
Powodem, dla którego chcę tego sparametryzowanego zachowania, chcę utworzyć wiele wystąpień ClassUnderTest, które zawierają różne wartości (wartości których są wytwarzane przez to, co jest zwracane z mockobj).
Kinda, co mam na myśli (to oczywiście nie działa):
mockobj = Mock(spec=MyDependencyClass)
mockobj.methodfromdepclass.ifcalledwith(42).return_value = "you called me with arg 42"
mockobj.methodfromdepclass.ifcalledwith(99).return_value = "you called me with arg 99"
assertTrue(mockobj.methodfromdepclass(42), "you called me with arg 42")
assertTrue(mockobj.methodfromdepclass(99), "you called me with arg 99")
cutinst1 = ClassUnderTest(mockobj, 42)
cutinst2 = ClassUnderTest(mockobj, 99)
# now cutinst1 & cutinst2 contain different values
Jak mogę osiągnąć ten „ifcalledwith” rodzaj semantyki?
Niesamowite, dokładnie to, czego potrzebowałem. Nie jest fanem składni, ale działa świetnie. Dzięki! –
Jedno zastrzeżenie, które chciałbym dodać tutaj, do którego uciekłem podczas korzystania z tego rozwiązania, które działa bardzo dobrze, przy okazji, jest to, że jeśli masz wyjątki jako efekty uboczne, musisz je podnosić, zamiast je zwracać. Biblioteka Mock jest dobra w pozwalaniu ci przypisać wyjątek do side_effect i zastanowienie się, ale z tą metodą musisz majsterkować. – ThatsAMorais