2016-08-13 7 views
1

ReviewBoard API 라이브러리를 사용하고 오늘 코드를 분리 클래스로 옮겨 일부 테스트를 통해 로직을 커버하고자했습니다. 나는 mock과 testing을 이해하지만 파이썬과 라이브러리에 대해서는별로 경험하지 못했습니다.비평과 모의를 사용하여 ReviewBoard 제 3 자 라이브러리를 비웃음

<!-- language: python --> 
from rbtools.api.client import RBClient 

class ReviewBoardWrapper(): 

    def __init__(self, url, username, password): 
     self.url = url 
     self.username = username 
     self.password = password 
     pass 

    def Connect(self): 
     self.client = RBClient(self.url, username=self.username, password=self.password) 
     self.root = self.client.get_root() 
     pass 

그리고 초기화뿐만 아니라 get_root() 메소드가 호출을 주장 할 다음은 실제 코드의 덩어리입니다. I가 붙어 오류

<!-- language: python --> 
import unittest 
import mock 

from module_base import ReviewBoardWrapper as rb 

class RbTestCase(unittest.TestCase): 

    @mock.patch('module_base.RBClient') 
    @mock.patch('module_base.RBClient.get_root') 
    def test_client_connect(self, mock_client, mock_method): 
     rb_client = rb('', '', '') 
     rb_client.Connect() 
     self.assertTrue(mock_method.called) 
     self.assertTrue(mock_client.called) 

을 그리고 여기 : 내가 잘못합니까 무엇

$ python -m unittest module_base_tests 
F. 
====================================================================== 
FAIL: test_client_connect (module_base_tests.RbTestCase) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/mock/mock.py", line 1305, in patched 
    return func(*args, **keywargs) 
    File "module_base_tests.py", line 21, in test_client_connect 
    self.assertTrue(mock_client.called) 
AssertionError: False is not true 

---------------------------------------------------------------------- 
Ran 2 tests in 0.002s 

FAILED (failures=1) 

여기에 내가 그것을 달성하려고하는 방법은? 가져온 라이브러리의 "로컬 복사본"을 올바르게 조롱합니까? 문제가 다른 지역에 완전히 있습니까?

@mock.patch('module_base.RBClient.__init__') 

그리고/또는이 :

가 나는 또한이 일을 시도 게시물의 예에서

self.assertTrue(mock_client.__init__.called) 
+0

: 리턴 값을 조롱하고 반환 값에 대한 주장을 만드는 예는 다음 싶습니다 assertTrue (mock_method.return_value.called) – qlf00n

답변

1

를 조롱의 순서가 반대로 :

test_client_connect(self, mock_client, mock_method) 

클라이언트가 실제로 두 번째 인수로 조롱되고 메서드 호출이 첫 번째 인수로 조롱되고 있습니다.

그러나 클라이언트를 올바르게 조롱하려면 클라이언트 호출의 반환 값을 조롱하고 싶습니다. 아래 DanGar에서 언급 한 바와 같이이 솔루션은 반환 값을 주장하는 것이었다 패치 장식의 잘못된 순서로 옆,

class RbTestCase(unittest.TestCase):                                           

    @mock.patch('module_base.RBClient')                                          
    def test_client_connect(self, mock_client):                                        
     client = mock.MagicMock()                                           
     mock_client.return_value = client                                         
     rb_client = rb('', '', '')                                           
     rb_client.Connect()                                             
     self.assertTrue(client.get_root.called)                                        
     self.assertTrue(mock_client.called) 
+0

추측하기. 약 4 일간 인터넷 검색, 코드 읽기 및 놀기를 한 후 문제를 발견했습니다. 오늘. 아침에. 그리고 당신에게 알려주고 싶었습니다. 그리고 당신의 대답을 봅니다. (시간을내어 주셔서 감사합니다. 틀림없는 모의을 주장하는 것이 문제였습니다. 나는 return_value 모의를 주장 했어야합니다 .. 예를 들어 " 상향식 "주문은 설명서의 패치 데코레이터의 의미를 의미하며 분명히 잘못되었습니다. – qlf00n