【问题标题】:Python Unit testing with mock and patch a foreign modul使用模拟和修补外部模块的 Python 单元测试
【发布时间】:2015-11-13 15:53:23
【问题描述】:

我想测试一个使用串行模块中的串行类的类。 我知道我必须模拟它们,但我没有启动并运行它:

from serial import Serial

import unittest
from mock import patch, MagicMock

class MyClass(object):
    def __init__(self):
        self.ser = Serial('/dev', 123)

    def write(self, message):
        if self.ser:
            self.ser.write(message)
            return True

    def read(self):
        if self.ser.inWaiting():
            return self.ser.read(1)
        return None


class MyClassTest(unittest.TestCase):

    def setUp(self):

        self.mc = MyClass()

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

        #Check if...
        mock.assert_called_with('/dev', 123)

    def test_write(self):
        self.mc.write('lala')

        #Check if...
        mock.write.assert_called_with('lala')

    def test_read(self):

        #patch inWaiting function...
        mock.inWaiting.retval = 4

        #patch inWaiting function...
        mock.read.retval = 'lulu'

        x = self.mc.read()

        self.assertEqual('lulu')

        #Check if...
        mock.read.assert_called_with(1)
  • 对于完整的 TestClass:我如何模拟 Serial 类以使其不使用真正的类?

  • 对于一些测试:我如何模拟带有参数 x 和返回值的 Serial.read(x)? (就像 Serial.inWaiting())

  • 对于一些测试:我如何模拟带有参数的 Serial.write(message),然后测试它是否使用参数消息调用?

  • 一个额外的问题:我应该使用 unittest2 吗?

【问题讨论】:

    标签: python unit-testing mocking monkeypatching


    【解决方案1】:

    也许最好的方法是去patchSerial上课。在您的情况下,您在测试模块中导入 Serial 并对其进行修补,您应该使用类似这样的东西

    def setUp(self):
        patcher = patch("__main__.Serial", autospec=True)
        self.mock = patcher.start()
        self.addCleanup(patcher.stop)
        self.mc = MyClass()
        self.mock.reset_mock()
    

    如果您将任何对mock 的引用更改为self.mocktest_read,您的测试应该可以工作,如下所示:

    def test_read(self):
        self.mock.inWaiting.return_value = 4
        self.mock.read.return_value = 'lulu'
        self.assertEqual(self.mc.read(), 'lulu')
        self.mock.read.assert_called_with(1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-15
      • 2021-10-31
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多