Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从单元测试django视图模拟模型方法?_Python_Django_Unit Testing_Django Rest Framework - Fatal编程技术网

Python 如何从单元测试django视图模拟模型方法?

Python 如何从单元测试django视图模拟模型方法?,python,django,unit-testing,django-rest-framework,Python,Django,Unit Testing,Django Rest Framework,我试图模拟一个下游函数调用,以使DRF视图的unittest通过 我的模型中有一个create()方法,它调用一个外部upload_files()函数。我正试图弄清楚如何模拟upload_files()调用(但是通过对我的视图的测试) 因为视图调用序列化程序,而序列化程序调用模型,所以我需要找出正确的名称空间来模拟路径。下面是我的代码,它显示了我正在尝试做的事情,但是我认为传递到mock.patch的路径是不正确的 运行unittest时收到此错误 ERROR: test_post (tests

我试图模拟一个下游函数调用,以使DRF视图的unittest通过

我的模型中有一个create()方法,它调用一个外部upload_files()函数。我正试图弄清楚如何模拟upload_files()调用(但是通过对我的视图的测试)

因为视图调用序列化程序,而序列化程序调用模型,所以我需要找出正确的名称空间来模拟路径。下面是我的代码,它显示了我正在尝试做的事情,但是我认为传递到mock.patch的路径是不正确的

运行unittest时收到此错误

ERROR: test_post (tests.api.views.test_stage_execution_view.StageExecutionViewTest)
ModuleNotFoundError: No module named 'myapp.models.stage_execution.StageExecution'; 'myapp.models.stage_execution' is not a package
从drf api对视图进行单元测试:

# myapp/tests/api/views/test_stage_execution_view.py

class StageExecutionViewTest(APITestCase):
    @mock.patch('myapp.models.stage_execution.StageExecution.create.upload_files', side_effect=mocked_upload_files)
    def setUp(self, arg):
        self.stage_execution = StageExecution.manager.create(
            stage="test",
            job_execution="test",
            time_start="2018-12-20T12:05:00.258797-08:00",
        )

    @mock.patch('myapp.models.stage_execution.StageExecution.create.upload_files', side_effect=mocked_upload_files)
    def test_post(self):
        start_stage_execution_payload = {"bla"}
        response = self.client.post(
        "/api/v2/stage_execution", start_stage_execution_payload, format="json"
    )
        assert response.status_code == 201
型号:

#myapp/models/stage_execution.py

class StageExecution(JsonableModel):
    stage = models.CharField(max_length=150, blank=True, null=True)
    job_execution = models.CharField(max_length=150, blank=True, null=True)
    time_start = models.DateTimeField()

class StageExecutionManager(models.Manager):
    def get_queryset(self):
        return StageExecutionQuerySet(self.model, using=self._db)

    def create(self, **kwargs):
        from myapp.tasks import upload_files
        upload_files()
序列化程序:

# myapp/api/serializers/stage_execution_serializer.py

class StageExecutionSerializer(serializers.ModelSerializer):

    class Meta:
        model = StageExecution
        fields = (
            "stage",
            "job_execution",
            "time_start"
观点:

# myapp/api/views/stage_execution_view.py

class StageExecutionView(GenericAPIView):
    serializer_class = StageExecutionSerializer

    def get_queryset(self):
        return StageExecution.manager.all()

    def get(self, request, format=None):
        queryset = self.get_queryset()

    if queryset.exists():
        serializer = StageExecutionSerializer(queryset, many=True)
        return Response(serializer.data)

您可以使用它来模拟上载\u文件

@mock.patch('myapp.tasks.upload_files')
def setUp(self, mocked_upload_files):
    mocked_upload_files.return_value = ""  # You can change here to get return value you need