Tôi có một lớp mà tôi đang thử nghiệm với tư cách là một lớp phụ thuộc một lớp khác (một thể hiện được chuyển đến phương thức init của CUT). Tôi muốn giả lập lớp này bằng thư viện Python Mock.Đối tượng Python Mock với phương thức được gọi là nhiều lần
gì tôi có là cái gì đó như:
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)
nào là tốt, nhưng "methodfromdepclass" là một phương pháp tham số, và như vậy tôi muốn tạo một đối tượng giả duy nhất mà phụ thuộc vào những gì đối số được truyền cho methodfromdepclass nó trả về các giá trị khác nhau.
Lý do tôi muốn hành vi tham số này là tôi muốn tạo nhiều phiên bản ClassUnderTest chứa các giá trị khác nhau (giá trị được tạo ra bởi giá trị được trả về từ mockobj).
Kinda những gì tôi đang suy nghĩ (điều này tất nhiên không hoạt động):
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
Làm thế nào để đạt được điều này "ifcalledwith" loại ngữ nghĩa?
Tuyệt vời, chính xác những gì tôi cần. Không phải là một fan hâm mộ của cú pháp, nhưng hoạt động tuyệt vời. Cảm ơn! –
Một báo trước mà tôi muốn thêm ở đây vào đó tôi chạy khi sử dụng giải pháp này, hoạt động rất tốt, btw, là nếu bạn có ngoại lệ như tác dụng phụ, người ta phải nâng cao chúng, thay vì trả lại chúng. Thư viện Mock là tốt về việc cho phép bạn chỉ định một ngoại lệ cho side_effect và tìm ra nó, nhưng với phương pháp này bạn phải DIY. – ThatsAMorais