나는이 멋진 라이브러리 인 unittest.mock
을 사용하고 있습니다. 그러나 예기치 않은 행동에 놀랐으며 확실한 해결책이 보이지 않습니다. 나는 그것을 단위 테스트에 사용하고 있으며 그것이 유용한 테스트를 수행하는 방법을 완벽하게 이해하는 것이 중요합니다.조롱 할 때 인스턴스의 메서드가 "self"로 호출되는지 테스트하는 방법은 무엇입니까?
show_bar
의 코드가 잘못되었음을 알고 있으며 인스턴스 메소드 대신 classMethod를 호출하고 있습니다. 그러나 내 모든 mock
unittests이 전달됩니다
class Foo(object):
def bar(self):
return "bar"
def show_bar(self):
return Foo.bar()
예상 사용량 :
foo = Foo()
assert foo.show_bar() == "bar"
# => throw exception: bar() missing 1 required positional argument: 'self'
유닛 테스트와 함께이 오류를 잡으려고 실패 시도
코드 버그을 포함 mock
:
from unittest.mock import patch
with patch.object(Foo, 'bar', return_value="bar") as mock:
foo = Foo()
assert foo.show_bar() == "bar"
mock.assert_called_once()
# => no errors
이상적으로, 나는 bar
이 self.bar()
호출 및 NOT Foo.bar()
되어 주장하고 싶습니다; 그것은 틀렸다. 불행히도 mock.assert_called_with()
을 사용하면 self
또는 cls
매개 변수를 고려하지 않으므로 다소 혼란 스럽습니다.
편집 : 명확히하려는 경우. 객체의 메소드를 패치 할 때 라이브러리 unittest.mock
을 사용하는 최상의 방법을 찾고 있습니다. 패치하는 방법이 나에게 명확하지 않은 것 같습니다. 현재 self.bar
또는 Foo.bar
을 호출하는 경우이를 주장 할 방법이 없습니다.
아무것도 조롱하지 말라, 단지'= 푸 f를 호출(); f.bar()'를 테스트 코드에 추가하십시오. 깨진 구현에서는'TypeError'를 발생시켜 테스트를 실패합니다. –
또한 FWIW, 이것은'classmethod'와는 아무런 관련이 없습니다 - 예를 들어'Foo.bar'는 언 바운드 인스턴스 메소드입니다. –
죄송합니다. 코드가 지나치게 단순화되어 있으므로 메소드의 실제 코드가 반환 값을 조롱하지 않고 호출 할 수 없기 때문에 mock을 사용해야합니다. 또한,'show_bar' 개발자가'Foo.bar()'를 호출 할 때'Foo.bar'가 classmethod이거나 staticmethod라고 가정하고있었습니다. 합리적인 진술처럼 보입니까? – Doomsday