【问题标题】:Django : How to upload CSV file in unit test case using APIClient from rest_frameworkDjango:如何使用来自 rest_framework 的 APIClient 在单元测试用例中上传 CSV 文件
【发布时间】:2021-10-05 21:00:55
【问题描述】:
def test_upload_csv_success(self):
    """Test uploading a csv file"""
    
    with open("innovators.csv", "w") as file:
        writer = csv.writer(file)
        writer.writerow(["SN", "Name", "Contribution"])
        writer.writerow([1, "Linus Torvalds", "Linux Kernel"])
        writer.writerow([2, "Tim Berners-Lee", "World Wide Web"])
        writer.writerow([3, "Guido van Rossum", "Python Programming"])                       
        
    with open("innovators.csv", "r") as file:              
        res = self.client.post(
            CSV_URL, {"file": file}, content_type="multipart/form-data"
        )        
    file.close()

    

    self.assertEqual(res.status_code, status.HTTP_201_CREATED)
    #self.assertIn('file', res.data)
    #self.assertTrue(os.path.exists(self.csv_model.file.path))

以下是错误,我/正在获取

系统检查未发现任何问题(0 静音)。 .F.

失败:test_upload_csv_success (core.tests.test_csv_api.CsvUploadTests) 测试上传 csv 文件

Traceback(最近一次调用最后一次): 文件“/Users/rounaktadvi/django_rest_api_projects/csv-store-api/core/tests/test_csv_api.py”,第 56 行,在 test_upload_csv_success self.assertEqual(res.status_code, status.HTTP_201_CREATED) 断言错误:400 != 201

【问题讨论】:

  • 文件通常以二进制模式通过网络发送,即以字节的形式。打开文件进行读取时,应以二进制方式打开。

标签: python django unit-testing django-rest-framework


【解决方案1】:

我想通了,这就是我所做的

@patch("pandas.read_csv")
@patch("pandas.DataFrame.to_sql")
def test_upload_csv_success(self, mock_read_csv, mock_to_sql) -> None:
    """Test uploading a csv file"""
    file_name = "test.csv"
    # Open file in write mode (Arrange)
    with open(file_name, "w") as file:
        writer = csv.writer(file)
        # Add some rows in csv file
        writer.writerow(["name", "area", "country_code2", "country_code3"])
        writer.writerow(
            ["Albania", 28748, "AL", "ALB"],
        )
        writer.writerow(
            ["Algeria", 2381741, "DZ", "DZA"],
        )
        writer.writerow(
            ["Andorra", 468, "AD", "AND"],
        )
    # open file in read mode
    data = open(file_name, "rb")
    # Create a simple uploaded file
    data = SimpleUploadedFile(
        content=data.read(), name=data.name, content_type="multipart/form-data"
    )

    # Perform put request (Act)
    res = self.client.put(CSV_URL, {"file_name": data}, format="multipart")
    # Mock read_csv() and to_sql() functions provided by pandas module
    mock_read_csv.return_value = True
    mock_to_sql.return_value = True

    # Assert
    self.assertEqual(res.status_code, status.HTTP_201_CREATED)
    self.assertEqual(res.data, "Data set uploaded")
    # Delete the test csv file
    os.remove(file_name)

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 2014-11-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2012-06-25
    相关资源
    最近更新 更多