【发布时间】: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