在Odoo环境中嘲笑?

问题描述 投票:3回答:1

有谁知道你怎么能为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属性而不是导入类并将它传递给另一个类继承。

python-3.x mocking odoo odoo-11
1个回答
2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.