Python 单元测试调用单元测试不知道的另一个方法的方法

Python 单元测试调用单元测试不知道的另一个方法的方法,python,unit-testing,Python,Unit Testing,如何测试调用另一个方法的简单方法?我正在尝试测试wssender方法 in worker.py ---------------- class Worker(self): def __init__(self, ws) self.ws = ws def wssender(self,str): newstr = '<br>{0}'.format(str) self.ws.sendMessage(newstr.encode(

如何测试调用另一个方法的简单方法?我正在尝试测试wssender方法

in worker.py
---------------- 
class Worker(self):
    def __init__(self, ws)
        self.ws = ws

    def wssender(self,str):
        newstr = '<br>{0}'.format(str)
        self.ws.sendMessage(newstr.encode())
及 wssender没有返回任何内容,因此我不确定在这种情况下测试什么。

这是怎么回事

import unittest
from unittest.mock import MagicMock

class Worker(object):
    def __init__(self, ws):
        self.ws = ws

    def wssender(self, str):
        newstr = '<br>{0}'.format(str)
        self.ws.sendMessage(newstr.encode())

class WorkerTests(unittest.TestCase):
    def test_wssender(self):
        # Arrange
        ws = MagicMock()
        ws.sendMessage = MagicMock()
        worker = Worker(ws)

        # Act
        worker.wssender('test send message')

        # Assert
        ws.sendMessage.assert_called_once_with(b'<br>test send message')

if __name__ == '__main__':
    unittest.main()
这个怎么样

import unittest
from unittest.mock import MagicMock

class Worker(object):
    def __init__(self, ws):
        self.ws = ws

    def wssender(self, str):
        newstr = '<br>{0}'.format(str)
        self.ws.sendMessage(newstr.encode())

class WorkerTests(unittest.TestCase):
    def test_wssender(self):
        # Arrange
        ws = MagicMock()
        ws.sendMessage = MagicMock()
        worker = Worker(ws)

        # Act
        worker.wssender('test send message')

        # Assert
        ws.sendMessage.assert_called_once_with(b'<br>test send message')

if __name__ == '__main__':
    unittest.main()
我假设“class Worker(self)”是一个输入错误,它实际上是“class Worker(object)”(或任何其他基类)

警告/第一个问题,您忘记在测试中实例化
工作者
-您想要:

ws = WhateverWsIsSupposedToBe()
wss=worker.Worker(ws)
wss.wssender(msg)
完全不相关,但
wssender()
不是一个好的方法名称-
sender
是一个正午,方法是动作,应该使用动词,所以
wssend()
(或者只是
send()
FWIW)会更好

现在关于第二个问题,你有两个选择。如果要测试的是消息格式,只需使用另一种方法将其拆分:

class Worker(object):
    def __init__(self, ws)
        self.ws = ws

    def prepare(self, msg):
        return '<br>{0}'.format(msg).encode(...)

    def send(self, msg):
        self.ws.sendMessage(self.prepare(msg))
或者您可以使用
mock
库,参见Tacg的答案。

我假设“类工作者(自我)”是一个输入错误,它实际上是“类工作者(对象)”(或任何其他基类)

警告/第一个问题,您忘记在测试中实例化
工作者
-您想要:

ws = WhateverWsIsSupposedToBe()
wss=worker.Worker(ws)
wss.wssender(msg)
完全不相关,但
wssender()
不是一个好的方法名称-
sender
是一个正午,方法是动作,应该使用动词,所以
wssend()
(或者只是
send()
FWIW)会更好

现在关于第二个问题,你有两个选择。如果要测试的是消息格式,只需使用另一种方法将其拆分:

class Worker(object):
    def __init__(self, ws)
        self.ws = ws

    def prepare(self, msg):
        return '<br>{0}'.format(msg).encode(...)

    def send(self, msg):
        self.ws.sendMessage(self.prepare(msg))

或者您可以使用
mock
库,参见Tacg的答案。

您正在注入
ws
(我假设websocket)作为对
工作者的依赖,这很好。这意味着您可以将其替换为测试代码中的模拟,然后对其执行验证。研究使用。
wss=worker.worker
应该是
wss=worker.worker(ws)
。您可以模拟
ws
。您正在注入
ws
(我假设websocket)作为对
Worker
的依赖,这很好。这意味着您可以将其替换为测试代码中的模拟,然后对其执行验证。研究使用。
wss=worker.worker
应该是
wss=worker.worker(ws)
。您可以模拟
ws
。这很有效,它帮助我更好地理解模拟,以便我可以在其他函数上尝试它(比这个函数复杂得多)。我知道我应该将代码分解成更小的函数并进行测试,但这对我已经编写的代码很有用。这可以帮助我更好地理解模拟,这样我就可以在其他函数上尝试它(比这个函数复杂得多)。我知道我应该将代码分解成更小的函数并进行测试,但这对我已经编写的代码很有用。这有助于,让它工作,在这种情况下,我不想修改旧代码,但继续将尝试将代码分解成更小的块。这有助于,让它工作,在这种情况下,我不想修改旧代码,但向前推进将尝试将代码分解为更小的块。
 class MockWs(object):
     def __init__(self):
         self.msg = None
     def sendMessage(self, msg):
         self.msg = msg

 class SimpleTest(unittest.TestCase):
     def test_send(self):
        ws = MockWs()
        msg = 'test send message'
        wss=worker.Worker(ws)
        wss.send(msg)
        expected = "<br>test send message"
        self.assertEqual(ws.msg, expected)