在单元测试中比较字典时如何忽略某些值?

Fli*_*imm 5 python python-unittest

我想断言两个字典是相等的,使用 Python 的unittest,但忽略字典中某些键的值,使用方便的语法,如下所示:

from unittest import TestCase

class Example(TestCase):
    def test_example(self):
        result = foobar()
        self.assertEqual(
            result,
            {
                "name": "John Smith",
                "year_of_birth": 1980,
                "image_url": ignore(), # how to do this?
                "unique_id": ignore(), #
            },
        )
Run Code Online (Sandbox Code Playgroud)

明确地说,我想检查所有四个键是否存在,我想检查"name"and的值"year_of_birth",(但不是"image_url""unique_id“),我想检查是否不存在其他键。

我知道我可以result在这里修改"image_url"and的键值对"unique_id",但我想要更方便的东西,不修改原始字典。

(这是受Test::DeepPerl 5 的启发。)

Sto*_*ica 8

unittest.mock.ANY与一切相比,有一种东西是平等的。

from unittest import TestCase
import unittest.mock as mock

class Example(TestCase):
    def test_happy_path(self):
        result = {
            "name": "John Smith",
            "year_of_birth": 1980,
            "image_url": 42,
            "unique_id": 'foo'
        }
        self.assertEqual(
            result,
            {
                "name": "John Smith",
                "year_of_birth": 1980,
                "image_url": mock.ANY,
                "unique_id": mock.ANY
            }
        )

    def test_missing_key(self):
        result = {
            "name": "John Smith",
            "year_of_birth": 1980,
            "unique_id": 'foo'
        }
        self.assertNotEqual(
            result,
            {
                "name": "John Smith",
                "year_of_birth": 1980,
                "image_url": mock.ANY,
                "unique_id": mock.ANY
            }
        )

    def test_extra_key(self):
        result = {
            "name": "John Smith",
            "year_of_birth": 1980,
            "image_url": 42,
            "unique_id": 'foo',
            "maiden_name": 'Doe'
        }
        self.assertNotEqual(
            result,
            {
                "name": "John Smith",
                "year_of_birth": 1980,
                "image_url": mock.ANY,
                "unique_id": mock.ANY
            }
        )

    def test_wrong_value(self):
        result = {
            "name": "John Smith",
            "year_of_birth": 1918,
            "image_url": 42,
            "unique_id": 'foo'
        }
        self.assertNotEqual(
            result,
            {
                "name": "John Smith",
                "year_of_birth": 1980,
                "image_url": mock.ANY,
                "unique_id": mock.ANY
            }
        )
Run Code Online (Sandbox Code Playgroud)