如何为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
相关产品推荐
相关产品推荐

