首页 > 解决方案 > Django mock 根本没有被调用

问题描述

我的测试定义如下

    @patch('user.serializers.validate_sns_token', return_value=True)
    def test_can_create_user(self, validate):
        """
        Test that user can be created without logging in
        :return:
        """
        user_payload = self.generate_user_payload()

        resp = self.client.post(
            CREATE_USER_URL,
            user_payload,
        )

        self.assertTrue(validate.called)

        self.assertEqual(
            resp.status_code,
            status.HTTP_200_OK,
        )

在 user.serializers.py 文件中,我有以下要模拟的函数

def validate_sns_token(**kwargs):
    try:
        ...
        return True
    except ValueError as e:
        ...
        return False

这是对 google api 的外部调用,所以我想总是从中返回 True。

在序列化程序中,我正在调用如下的创建函数

    def create(self, validated_data):
        ...

        is_token_valid = validate_sns_token(
            sns_id=sns_id,
            sns_type=sns_type,
            token=token,
        )

        if is_token_valid is False:
            raise serializers.ValidationError('토큰이 유효하지 않습니다. 다시 로그인해주세요.', code='AUTH')

        ...

        return user

不幸的是, validate.call 总是 False 并且原始的 validate_sns_token 仍然被调用。如何编写测试,以便根本不调用原始的 validate_sns_token 但将其返回值设置为 True?

标签: djangounit-testingdjango-rest-framework

解决方案


推荐阅读