有谁知道你怎么能为Odoo对象编写模拟测试?
我有这些类和方法:
my_module:
from odoo import models
class MyModel(models.Model):
_name = 'my.model'
def action_copy(self):
IrTranslation = self.env['ir.translation']
for rec in self:
if rec.translate:
IrTranslation.force_translation(rec)
my_module_2:
from odoo import models
class IrTranslation(models.Model):
_inherit = 'ir.translation'
def force_translation(self, rec):
# do stuff
当我调用它时,我想测试IrTranslation.force_translation
是否在action_copy
方法中被调用了多少次。
但是这种方法不是直接导入的,而是通过env
引用的。
如果让我们说force_translation
将导入如下:
from my_module_2.IrTranslation import force_translation
def action_copy(self):
# do stuff.
force_translation()
然后我可以尝试做这样的事情:
from unittest import mock
from my_module import action_copy
def test_some_1(self):
with mock.patch('my_module.my_module_2.IrTranslation') as mocked_translation:
action_copy()
mocked_translation.force_translation.assert_called_once()
但是因为Odoo中的模块不是直接导入的(就像你在普通的Python中那样),我不明白如何在Odoo环境中指定要模拟的方法。
附:我也没有在标准的Odoo中看到任何模拟测试,除了没有继承Model
类的基类 - >然后你需要使用它的_inherit
属性而不是导入类并将它传递给另一个类继承。
在Odoo中进行测试不使用模拟的概念。相反,测试是从标准基类派生的。标准类TransactionalTest
打开一个事务并且从不提交它,但是将其回滚以撤消任何更改。
这显然与常规模拟不同,因为您无法替换其他方法或类以返回固定/期望值和/或避免除数据库中持久更改之外的其他副作用,例如发送电子邮件或调用远程Web服务。