如何测试Odoo中未继承Model的自定义类?
测试Odoo非模型自定义类的可行方案
方案一:纯单元测试(unittest.TestCase)
- 解决导入问题:确保测试文件和自定义类的导入路径正确。比如自定义类在
your_module/xml_generator.py,测试文件在your_module/tests/test_xml_gen.py,用相对导入:from ..xml_generator import InvoiceXMLGenerator;如果是外部调用,用绝对导入from odoo.addons.your_module.xml_generator import ...。 - 模拟依赖数据:如果类需要处理发票数据,不要直接依赖Odoo的ORM记录,手动构造模拟数据(字典或简单类实例),包含生成XML所需的字段即可。
- 示例代码:
import unittest from ..xml_generator import InvoiceXMLGenerator class TestInvoiceXMLGen(unittest.TestCase): def setUp(self): # 构造模拟发票数据 self.mock_invoice = { 'name': 'INV/2024/0001', 'amount_total': 150.50, 'partner': {'name': 'ABC Corp', 'vat': '987654321'}, 'lines': [{'product': 'Service X', 'price': 150.50, 'qty': 1}] } self.generator = InvoiceXMLGenerator() def test_xml_content(self): xml_result = self.generator.generate(self.mock_invoice) # 验证关键节点存在 self.assertIn('<invoice_number>INV/2024/0001</invoice_number>', xml_result) self.assertIn('<total>150.50</total>', xml_result)
方案二:轻量Odoo环境(BaseCase)
如果你的类需要用到Odoo的核心工具(比如货币格式化、本地化处理),但不需要完整的数据库事务,用odoo.tests.common.BaseCase替代TransactionCase——它不会初始化模型事务,避免RuntimeError/TypeError:
- 示例代码:
from odoo.tests.common import BaseCase from odoo.addons.your_module.xml_generator import InvoiceXMLGenerator class TestInvoiceXMLGen(BaseCase): def setUp(self): super().setUp() # 可以直接使用Odoo的环境对象调用基础工具 self.eur_currency = self.env.ref('base.EUR') self.generator = InvoiceXMLGenerator(currency=self.eur_currency) def test_amount_format(self): formatted = self.generator.format_amount(200.0) self.assertEqual(formatted, '200,00 €')
报错原因说明
- 使用
TransactionCase报错:因为它会自动创建Odoo模型的事务上下文,你的类不属于Odoo模型,会触发ORM初始化相关的错误,完全不适合这类测试。 - unittest导入报错:检查测试文件是否放在模块的
tests目录下,且tests/__init__.py中正确导入了测试模块;同时确认自定义类所在的模块在根__init__.py中已导出。
内容的提问来源于stack exchange,提问作者Juan Luis Andián Tápiz
相关产品推荐
相关产品推荐

