1

メソッドによって返されるデータの属性にパッチを適用したいと思います。

私が次の簡略化されたピースコードを持っていると仮定します。

@patch('requests.post')
class TestKeywordsApi(BaseTest):
    # Instantiate API class and set the apikey
    def setUp(self):
        BaseTest.setUp(self)
        self.fixtures = FIXTURES
        self.api = BaseApi()

    def mock_requests_post(self, url, data=None):
        ''' Mock method for post method from responses library.
            It replaces the responses.post calls in Api class.
        '''
        url = self.encode_url(url, data)
        if url:
            return self.fixtures[url]

    def test_save_success(self, mock_post):
        mock_post.side_effect = self.mock_requests_post

        response = self.api.post(keyword, params={...})

        # list of asserts

# original class calling requests.post    
import requests
class BaseApi(object):
    def post(self, action, params):
        ''' Sends a POST request to API '''
        response = requests.post(self.build_url(action), data=params).content

上記のコードは、mockメソッドがリクエストライブラリに存在する「content」属性のモック/スタブを提供しないために失敗します。コンテンツ属性をスタブする方法を知っている人はいますか?

4

2 に答える 2

0

モックされたpost関数requestsは、属性を持つ、応答オブジェクトに似たオブジェクトを返す必要があり.contentます。例えば:

from mock import Mock, patch
#[...]
def mock_requests_post(self, url, data=None):
    ''' Mock method for post method from responses library.
        It replaces the responses.post calls in Api class.
    '''
    mock_response = Mock()
    mock_response.content = 'my test response content'
    url = self.encode_url(url, data)
    if url:
        mock_response.url_called = self.fixtures[url]
    return mock_response
于 2012-09-15T06:23:43.643 に答える
0

mock_requests_post メソッドのみを変更し、必要な属性を持つ内部クラスを追加する次のソリューションを見つけました。

def mock_requests_post(self, url, data=None):
    ''' Mock method for post method from responses library.
        It replaces the responses.post calls in Api class.
    '''
    url = self.encode_url(url, data)

    class classWithAttributes(object):
        content = json.dumps(self.fixtures[url])

    if url:
        return classWithAttributes()
于 2012-09-18T12:48:59.347 に答える