单元测试 python?

Unittesting python?

我有一些功能 api

def is_car_exist(make, model):
    
    
    url = f'https://vpic.nhtsa.dot.gov/api/vehicles/GetModelsForMake/\
    {make.capitalize()}?format=json'
    data = requests.get(url).json()['Results']
    return any(model.capitalize() == car['Model_Name'] for car in data)

我有一些集成测试:

class TestCar(unittest.TestCase):
    def test_is_car_exist(self):
        self.assertTrue(car.is_car_exist('honda', 'civic'))
        self.assertFalse(car.is_car_exist('Mars', 'merana'))

请你展示一下 Unittest 相对于我的函数看起来如何。

解决方案

使用unittest.mock模块。可以找到更多详细信息 here.

import unittest
from unittest.mock import patch

import car


class TestCar(unittest.TestCase):
    @patch("requests.get")
    def test_is_car_exist(self, requests_get):
        requests_get.return_value.json.return_value = {"Results": [{"Model_Name": "Civic"}]}

        self.assertTrue(car.is_car_exist('honda', 'civic'))
        self.assertFalse(car.is_car_exist('Mars', 'merana'))

说明

patch 将真实对象或函数替换为模拟对象或函数。它需要一个位置参数 target 来填充。此目标需要像正常导入一样使用 path.to.module 符号导入。

一种使用方法是将其用作装饰器。作为装饰器使用时,需要在装饰函数中添加参数。在这种情况下,它是 requests_get.

.return_value 用于函数调用和你想要的 return.

requests_get.return_value.json.return_value 表示您希望 requests.get 的 return 值是一个对象,该对象具有一个名为 json 的方法,该方法 returns {"Results": [{"Model_Name": "Civic"}]}