And*_*ius 5 mocking python-3.x odoo odoo-11
有谁知道如何为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)
Run Code Online (Sandbox Code Playgroud)
my_module_2:
from odoo import models
class IrTranslation(models.Model):
_inherit = 'ir.translation'
def force_translation(self, rec):
# do stuff
Run Code Online (Sandbox Code Playgroud)
当我调用它时,我想测试是否IrTranslation.force_translation
在action_copy
方法中被调用了多少次。
但是此方法不是直接导入的,而是通过引用的env
。
如果说force_translation
可以像这样导入:
from my_module_2.IrTranslation import force_translation
def action_copy(self):
# do stuff.
force_translation()
Run Code Online (Sandbox Code Playgroud)
然后,我可以尝试执行以下操作:
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()
Run Code Online (Sandbox Code Playgroud)
但是由于Odoo中的模块没有直接导入(就像您在普通的Python中那样),所以我不明白如何在Odoo环境中指定要模拟的方法。
PS我也没有在标准Odoo中看到任何模拟测试,除了不继承class- Model
>的基类,然后您需要使用其_inherit
属性而不是导入类并将其传递给另一个类。
Odoo 中的测试不使用模拟的概念。相反,测试是从标准基类派生的。标准类TransactionalTest
打开一个事务并且从不提交它,而是回滚它以撤消任何更改。
这显然与常规模拟不同,因为您无法替换其他方法或类来返回固定/预期值和/或避免除了数据库中持久更改之外的其他副作用,例如发送电子邮件或调用远程 Web 服务。
归档时间: |
|
查看次数: |
241 次 |
最近记录: |