模拟功能外包

时间:2018-02-28 11:48:06

标签: python-3.x unit-testing testing mocking django-tests

我正在开发一个包含不同应用程序的Django软件。我正在测试一些视图,我想在这些视图中模拟函数的返回。

例如,我有这个视图(位于apps.policies.views):

Traceback (most recent call last):
  File "test.py", line 29, in <module>
    hary = ret_cuda.copy_to_host()
  File "C:\ProgramData\Anaconda3\envs\ncuda\lib\site-packages\numba\cuda\cudadrv\devices.py", line 212, in _require_cuda_context
    return fn(*args, **kws)
  File "C:\ProgramData\Anaconda3\envs\ncuda\lib\site-packages\numba\cuda\cudadrv\devicearray.py", line 237, in copy_to_host
    _driver.device_to_host(hostary, self, self.alloc_size, stream=stream)
  File "C:\ProgramData\Anaconda3\envs\ncuda\lib\site-packages\numba\cuda\cudadrv\driver.py", line 1606, in device_to_host
    fn(host_pointer(dst), device_pointer(src), size, *varargs)
  File "C:\ProgramData\Anaconda3\envs\ncuda\lib\site-packages\numba\cuda\cudadrv\driver.py", line 288, in safe_cuda_api_call
    self._check_error(fname, retcode)
  File "C:\ProgramData\Anaconda3\envs\ncuda\lib\site-packages\numba\cuda\cudadrv\driver.py", line 323, in _check_error
    raise CudaAPIError(retcode, msg)
numba.cuda.cudadrv.driver.CudaAPIError: [719] Call to cuMemcpyDtoH results in UNKNOWN_CUDA_ERROR

函数save_to_ipfs位于apps.utils.ipfs_storage,是我想要模拟的函数,无需连接到IPFS即可返回固定值。

我在apps.policies.tests.test_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)

问题是模拟不起作用,当reurn必须是self.IPFS_JSON_MOCK的内容时它返回空。

我希望我已经正确解释了,先谢谢!

1 个答案:

答案 0 :(得分:0)

我在这里吸取了教训:

“如果你想在调用mock时运行一个函数,那就是side_effect,而不是return_value”

在TestClass之外,添加一个函数:

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

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/