在Odoo环境中嘲笑吗?

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_translationaction_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属性而不是导入类并将其传递给另一个类。

miw*_*miw 2

Odoo 中的测试不使用模拟的概念。相反,测试是从标准基类派生的。标准类TransactionalTest打开一个事务并且从不提交它,而是回滚它以撤消任何更改。

这显然与常规模拟不同,因为您无法替换其他方法或类来返回固定/预期值和/或避免除了数据库中持久更改之外的其他副作用,例如发送电子邮件或调用远程 Web 服务。