You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Wagtail RichText区块内容编写单元测试?

问题描述

我正在为Wagtail CMS项目编写内容导入器,需要将字符串解析为StreamField的RichText区块,代码如下:

from wagtail.rich_text import RichText

block_content = """<p>Some paragraph</p>"""

block_tuple = (
    "rich_text", 
    RichText(block_content),
)

expected_block_tuple = (
    "rich_text",
    RichText(block_content),
)

assertEqual(
    block_tuple,
    expected_block_tuple
)

这个单元测试对降低导入脚本的数据丢失风险至关重要,但断言失败了——因为区块元组里的RichText是不同内存地址的实例,字符串表示会显示不同的对象地址,示例如下:

('rich_text', <wagtail.rich_text.RichText object at 0x7ff683745b50>)

请问该如何编写断言以确保解析后的RichText区块输出与预期值匹配?

解决方案

直接比较包含RichText实例的元组会因为实例内存地址不同失败,需要针对RichText的核心内容做断言,以下是几种可行方法:

1. 直接比较RichText的原始HTML内容

RichText对象的source属性存储了原始HTML字符串,直接对比这个属性就能验证内容一致性:

from wagtail.rich_text import RichText
from unittest import TestCase

class TestRichTextImport(TestCase):
    def test_rich_text_block(self):
        block_content = """<p>Some paragraph</p>"""
        
        block_tuple = ("rich_text", RichText(block_content))
        expected_block_tuple = ("rich_text", RichText(block_content))
        
        # 先验证区块类型一致,再验证RichText的原始内容
        self.assertEqual(block_tuple[0], expected_block_tuple[0])
        self.assertEqual(block_tuple[1].source, expected_block_tuple[1].source)

2. 直接比较RichText实例(推荐)

Wagtail的RichText类已经实现了__eq__方法,会自动对比内部的source属性,所以可以直接比较元组:

from wagtail.rich_text import RichText
from unittest import TestCase

class TestRichTextImport(TestCase):
    def test_rich_text_block(self):
        block_content = """<p>Some paragraph</p>"""
        
        block_tuple = ("rich_text", RichText(block_content))
        expected_block_tuple = ("rich_text", RichText(block_content))
        
        # 直接对比元组即可,RichText实例会正确判断相等性
        self.assertEqual(block_tuple, expected_block_tuple)

注:如果你的Wagtail版本较旧(低于2.10左右)可能未实现该方法,此时优先用第一种方案。

3. 序列化后对比(验证存储格式)

如果需要验证区块和StreamField存储的格式一致,可以用RichTextBlock的序列化方法对比:

from wagtail.rich_text import RichText
from wagtail.core.blocks import RichTextBlock
from unittest import TestCase

class TestRichTextImport(TestCase):
    def test_rich_text_block(self):
        block_content = """<p>Some paragraph</p>"""
        
        block_tuple = ("rich_text", RichText(block_content))
        expected_block_tuple = ("rich_text", RichText(block_content))
        
        rich_text_block = RichTextBlock()
        # 对比序列化后的内容,和数据库存储格式一致
        self.assertEqual(
            rich_text_block.get_prep_value(block_tuple[1]),
            rich_text_block.get_prep_value(expected_block_tuple[1])
        )

内容的提问来源于stack exchange,提问作者Brylie Christopher Oxley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 05:35:06