Python模拟回调

时间:2016-05-13 09:22:10

标签: python unit-testing mocking

我希望尝试对某种设计模式进行单元测试,并且在使用工作时遇到一些麻烦。非常感谢在这个问题上的一些帮助。以下是我想测试的代码的基本概念。我在修补和create_autospec上尝试了一些不同的变体,但无法使回调正常工作。

我想模仿b.start()方法只是做回调而不是所有的逻辑。

使用最新尝试更新了代码。回调方法没有被约束。

A.py

import time
from B import B

class A(object):
    def __init__(self):
        self.b = None
        self.flag = True

    def start_b(self):
        self.b = self.create_b()
        self.b.callback = self.b_completed
        self.b.start()
        while self.flag:
            print("Waiting on Job Finish")
            time.sleep(1)

    def create_b(self):
        return B()

    def b_completed(self, b):
        self.flag = False

B.py

from threading import Thread

class B(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.callback = None

    def run(self):
        # do some logic
        print("In B.run")
        self.callback(self)

测试/ test_A.py

import unittest
from mock import mock
import A
import B

class ATestCase(unittest.TestCase):

    @mock.patch.object(A.A, "create_b", autospec=True)
    def test_simple(self, mock_create_b):
        mock_create_b.side_effect = create_b_mock
        a = A.A()
        a.start_b()
        # Assertion Logic


def create_b_mock(self):
    b = mock.MagicMock(spec=B.B)
    b.start.side_effect = callback_method
    return b

def callback_method(self):
    self.callback(self)

错误: TypeError:callback_method()缺少1个必需的位置参数:' self'

1 个答案:

答案 0 :(得分:0)

如果你的代码是正确的,我的意思是,没有缩进错误,你在类之外调用callback_method,位置参数为self。这是错误。

如果来自 tests / test_A.py callback_method应该在课程内,您将收到unittest.TestCase没有回调方法的错误。