我正在尝试模拟一个下游函数调用,以便让我的单元测试通过DRF视图。
我的模型中有一个create()方法,即调用外部upload_files()函数。我正在尝试弄清楚如何模拟upload_files()调用(但来自对我的视图的测试)
由于视图调用序列化程序,而序列化程序调用模型,因此我需要找出正确的名称空间,以便模拟路径。这是我的代码,它显示了我正在尝试做的事情,但是我认为传递给mock.patch的路径是不正确的。
在运行单元测试时收到此错误
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)
发布于 2020-02-21 00:22:03
您可以使用它模拟upload_files
@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
https://stackoverflow.com/questions/60328429
复制相似问题