2017-09-19 6 views
0

나는이 멋진 라이브러리 인 unittest.mock을 사용하고 있습니다. 그러나 예기치 않은 행동에 놀랐으며 확실한 해결책이 보이지 않습니다. 나는 그것을 단위 테스트에 사용하고 있으며 그것이 유용한 테스트를 수행하는 방법을 완벽하게 이해하는 것이 중요합니다.조롱 할 때 인스턴스의 메서드가 "self"로 호출되는지 테스트하는 방법은 무엇입니까?

show_bar의 코드가 잘못되었음을 알고 있으며 인스턴스 메소드 대신 classMethod를 호출하고 있습니다. 그러나 내 모든 mockunittests이 전달됩니다

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 

이상적으로, 나는 barself.bar() 호출 및 NOT Foo.bar()되어 주장하고 싶습니다; 그것은 틀렸다. 불행히도 mock.assert_called_with()을 사용하면 self 또는 cls 매개 변수를 고려하지 않으므로 다소 혼란 스럽습니다.

편집 : 명확히하려는 경우. 객체의 메소드를 패치 할 때 라이브러리 unittest.mock을 사용하는 최상의 방법을 찾고 있습니다. 패치하는 방법이 나에게 명확하지 않은 것 같습니다. 현재 self.bar 또는 Foo.bar을 호출하는 경우이를 주장 할 방법이 없습니다.

+0

아무것도 조롱하지 말라, 단지'= 푸 f를 호출(); f.bar()'를 테스트 코드에 추가하십시오. 깨진 구현에서는'TypeError'를 발생시켜 테스트를 실패합니다. –

+0

또한 FWIW, 이것은'classmethod'와는 아무런 관련이 없습니다 - 예를 들어'Foo.bar'는 언 바운드 인스턴스 메소드입니다. –

+0

죄송합니다. 코드가 지나치게 단순화되어 있으므로 메소드의 실제 코드가 반환 값을 조롱하지 않고 호출 할 수 없기 때문에 mock을 사용해야합니다. 또한,'show_bar' 개발자가'Foo.bar()'를 호출 할 때'Foo.bar'가 classmethod이거나 staticmethod라고 가정하고있었습니다. 합리적인 진술처럼 보입니까? – Doomsday

답변

1

전화를 걸었을 때 어쨌든 TypeError를 발생시키지 않는지 테스트하기 위해 메서드를 조롱해야하는 이유를 이해할 수 없습니다 ... 누군가가 unittest.mock을 사용하여이 문제를 해결하는 방법을 설명 할 수도 있습니다. 단지 자신이 unittest.mock 모의 Foo.bar를 건너 뛸 수 있습니다 :

callargs = dict() 
def mock_bar(self): 
    callargs["self"] = self 
    return "bar" 

foobar = Foo.__dict__["bar"] 
Foo.bar = mock_bar 
try: 
    foo = Foo() 
    assert foo.show_bar() == "bar" 
    assert "self" in callargs 
    assert callargs["self"] is foo 
finally: 
    Foo.bar = foobar 
+0

실제로 사소한 내 문제를 해결하기 위해 노력하고있어, 내 클래스를 "수동으로"조롱하지 않고, unittesting에서 메소드 호출을 바꿀 때'unittest.mock'을 올바르게 사용하려고합니다. 문맥. 그래도 도와 ​​줘서 고마워! – Doomsday