python - 设置模拟 asyncio.coroutine 的返回值

标签 python unit-testing python-unittest python-asyncio

我试图在我正在测试的类中模拟辅助方法,但我无法设置返回值。相反,它是 None,这会导致调用方法出错。

import unittest
import asyncio
import unittest.mock

class MyClass:

    @asyncio.coroutine
    def return_number(self):
        return 5

    @asyncio.coroutine
    def add_two(self):
        val = yield from self.return_number()
        return val + 2


class TestMyClass(unittest.TestCase):

    def setUp(self):
        self.mc = MyClass()

    def test_add(self):
        val = asyncio.get_event_loop().run_until_complete(self.mc.add_two())
        self.assertEqual(val, 7)

    def test_with_mock(self):
        """ Replace return_number with mocked method """
        mm = unittest.mock.MagicMock()
        mm.iter.return_value = 2
        self.mc.return_number = unittest.mock.Mock(return_value=mm)

        val = asyncio.get_event_loop().run_until_complete(self.mc.add_two())
        self.assertEqual(val, 4)


if __name__ == '__main__':
    unittest.main()

在此示例中是否有某种方法可以模拟 return_number 以便返回特定值?

最佳答案

你也可以做类似的事情:

def test_with_mock(self):
    """ Replace return_number with mocked method """
    with mock.patch.object(self.mc, "return_number", return_value=2):
        self.mc.return_number = asyncio.coroutine(self.mc.return_number)
        val = asyncio.get_event_loop().run_until_complete(self.mc.add_two())
        self.assertEqual(val, 4)

关于python - 设置模拟 asyncio.coroutine 的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33682765/

相关文章:

python - 为什么我在 pip 安装模块时得到这些 "WARNING: Target Directory <directory> already exists."?

python - 使用 python 计算平面文件中字符串的出现次数

python - 运行跳过的 python 测试

python - Django 查询未知数量的多个日期范围

python - 将元组字符串转换为元组

java - Jmock/junit 测试

javascript - to.have.been.calledWith is not a function 错误 in chai#3.5.0

java - 在单元测试中我应该进行多少对象初始化?

python - 使用unittest时如何自由组合多个setUp()/tearDown()基类?

Python 接口(interface)模式和单元测试代码覆盖率