Python: Creating a mock or fake directory with files for unittesting

前端 未结 1 1109
执笔经年
执笔经年 2021-01-05 07:56

I am trying to create a unit test for the following function:

def my_function(path):
    #Search files at the given path
    for file in os.listdir(path):
           


        
相关标签:
1条回答
  • 2021-01-05 08:35

    First of all, you forgot to pass the mocked object to test function. The right way to use mock in your test should be like this.

    @mock.patch('my_module.os')
    def test_my_function(self, mock_path):
    

    Anyway, you shouldn't mock the endswith, but the listdir. The snippet below is an example and may help you.

    app.py

    def check_files(path):
        files = []
        for _file in os.listdir(path):
            if _file.endswith('.json'):
                files.append(_file)
        return files
    

    test_app.py

    import unittest
    import mock
    from app import check_files
    
    
    class TestCheckFile(unittest.TestCase):
    
        @mock.patch('app.os.listdir')
        def test_check_file_should_succeed(self, mock_listdir):
            mock_listdir.return_value = ['a.json', 'b.json', 'c.json', 'd.txt']
            files = check_files('.')
            self.assertEqual(3, len(files))
    
        @mock.patch('app.os.listdir')
        def test_check_file_should_fail(self, mock_listdir):
            mock_listdir.return_value = ['a.json', 'b.json', 'c.json', 'd.txt']
            files = check_files('.')
            self.assertNotEqual(2, len(files))
    
    if __name__ == '__main__':
        unittest.main()
    

    Edit: Answering your question in comment, you need to mock the json.loads and the open from your app.

    @mock.patch('converter.open')
    @mock.patch('converter.json.loads')
    @mock.patch('converter.os.listdir')
    def test_check_file_load_json_should_succeed(self, mock_listdir, mock_json_loads, mock_open):
        mock_listdir.return_value = ['a.json', 'file_im_looking_for.json', 'd.txt']
        mock_json_loads.return_value = [{"name": "test_json_file", "type": "General"}]
        files = check_files('.')
        self.assertEqual(1, len(files))
    

    But remember! If your is too broad or hard to maintain, perhaps refactoring your API should be a good idea.

    0 讨论(0)
提交回复
热议问题