在Django/DRF测试中模拟shell脚本
我想在视图中的一个方法上做一些测试,但这个方法会调用一个脚本,而这个脚本是为另一个操作系统写的,所以我需要模拟一下这个情况。
这是我的测试代码:
@patch('check_web_share_file_folder.get_path_from_inode')
def test_list_with_search_mocked(self, mock_get_attribute):
mock_get_attribute.return_value = 'expected value'
request = self.factory.get('/fake-url')
force_authenticate(request, user=self.user)
view = WebShareFileFolderViewSet.as_view({'get': 'list'})
response = view(request)
self.assertEqual(response.status_code, status.HTTP_200_OK)
这里是问题,我在测试时遇到了这个错误:
AttributeError: <function check_web_share_file_folder at 0x00000237FD567708> does not have the attribute 'get_path_from_inode'
check_web_share_file_folder.py 里当然有 get_path_from_inode() 这个方法。
def get_path_from_inode(inode):
std, err, code = popen_wrapper([
'sudo', 'get_path_from_inode.sh',
str(inode)
])
if code != 0:
return False
return str(std.strip())[1:]
django/
├── webshare/
│ ├── actions
│ │ └── check_web_share_file_folder.py
│ ├────────
│ └── tests
│ └── factories
│ └── test_web_share_file_folder_view.py
1 个回答
0
你确定这些文件在同一个文件夹里吗?
另外,看起来Python试图从function中获取'get_path_from_inode',而不是从模块'check_web_share_file_folder.py'中。
更新:根据你的文件夹结构,你应该修改这一部分:
@patch('webshare.actions.check_web_share_file_folder.get_path_from_inode')
这是来自文档的内容:
@patch('package.module.ClassName.attribute', sentinel.attribute)
https://docs.python.org/3/library/unittest.mock-examples.html