簡體   English   中英

模擬功能外包裝

[英]Mock function outside package

我正在開發帶有不同應用程序的Django軟件。 我正在測試一些視圖,並且想在這些視圖中模擬函數的返回。

例如,我有此視圖(位於apps.policies.views):

def upload_policy_document(request):

    # code fragment avoid

    # save document ot ipfs
    response_data = save_to_ipfs(app_name=app_name,
                                 process_instance=process_instance,
                                 file=policy_document)
    # more code avoided

    return JsonResponse(data=response_data)

函數save_to_ipfs位於apps.utils.ipfs_storage,是我要模擬的函數,用於在不連接IPFS的情況下返回固定值。

我在apps.policies.tests.test_views中對此視圖進行了一些測試。 作為測試示例,我有:

class UpdatePolicyDocumentMockCase(SimpleTestCase):

    IPFS_JSON_MOCK = {"Hash": "mockhash"}

    def setUp(self):
        # some setup before tests

    @patch('apps.utils.ipfs_storage.save_to_ipfs')
    def some_test(self, mock_method):

        mock_method.return_value = self.IPFS_JSON_MOCK
        self.assertEqual(save_to_ipfs("", "", ""), self.IPFS_JSON_MOCK)

問題是該模擬無法正常工作,並且當重播必須是self.IPFS_JSON_MOCK的內容時,它將返回空。

希望我已經正確解釋了,在此先感謝!

我在這里學到了教訓:

“如果要在每次調用模擬時都運行一個函數,那就是side_effect,而不是return_value”

在TestClass之外,添加一個func:

local_save_to_ipfs():
   IPFS_JSON_MOCK = {"Hash": "mockhash"}
   return IPFS_JSON_MOCK

UpdatePolicyDocumentMockCase內部, UpdatePolicyDocumentMockCase更改,它應該可以工作。

它應該只是一個不帶()的函數名稱

mock_method.side_effect = local_save_to_ipfs()

這是沒有圓括號或括號的正確方法

mock_method.side_effect = local_save_to_ipfs

這是一個示例的鏈接:

https://fgimian.github.io/blog/2014/04/10/using-the-python-mock-library-to-fake-regular-functions-during-tests/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM