【问题标题】:Pytest PropertyMock as return_value for MagicMock does not get invokedPytest PropertyMock 作为 MagicMock 的 return_value 没有被调用
【发布时间】:2018-08-27 14:46:10
【问题描述】:

我试图将MagicMock 实例的return_value 模拟为PropertyMock,但它似乎在没有调用它的情况下返回PropertyMock 对象,即不返回实际值。

class MySerializer(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        # ...
        fields = (
            "my_field"
        )

    my_field = serializers.SerializerMethodField()

    def get_my_field(self, instance):
        other_models = instance.other_models.filter(stuff="stuff")
        if other_models:
            # returns <class 'unittest.mock.PropertyMock'> instead of an actual value
            print(type(other_models.get().my_property))
            # throws error since it isn't receiving a string
            return ujson.loads(other_models.get().my_property)
        return {}


# test case
def test_hello(mocker):
    expected_value = ujson.dumps({'hello': 2})
    instance_mock = mocker.MagicMock()
    other_model_mock = mocker.MagicMock()
    other_model_mock.get().my_property = mocker.PropertyMock(return_value=expected_value)
    instance_mock.other_models.filter.return_value = other_model_mock

    serializer = MySerializer()
    observed_value = serializer.get_my_field(instance_mock)
    assert expected_value == observed_value

【问题讨论】:

    标签: python django django-rest-framework pytest pytest-django


    【解决方案1】:

    我不需要将 other_model_mock 设置为 MagicMock,只需将其设置为 PropertyMock 即可

    expected_value = {'hello', 2}
    instance_mock = mocker.MagicMock()
    other_model_mock = mocker.PropertyMock()
    other_model_mock.get().my_property.return_value = ujson.dumps(expected_value)
    instance_mock.other_models.filter.return_value = other_model_mock
    # ... 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多