在Django/DRF测试中模拟shell脚本

0 投票
1 回答
40 浏览
提问于 2025-04-14 16:09

我想在视图中的一个方法上做一些测试,但这个方法会调用一个脚本,而这个脚本是为另一个操作系统写的,所以我需要模拟一下这个情况。

这是我的测试代码:

@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

撰写回答