繁体   English   中英

嘲弄通讯

[英]Mocking Communications

我正在python中构建一个应用程序,它使用包装来执行硬件通信的库

我想创建一些测试单元,我对单元测试很新,所以我想嘲笑通信,但我真的不知道怎么做

快速举例:

这是使用comm lib的应用程序代码

def changeValue(id, val):
    current_value = comm.getval(id)
    if (current_value != val):
        comm.send(id, val)

我想在不执行通信的情况下测试它,即用一些模拟值替换comm.getval返回,并将comm.send发送到模拟的comm类。

任何人都可以暗示一下吗?


问题是comm是一个类中的对象

让我们说这个课程是这样的:

class myClass:
    comm = Comm()
    ....
    def __init__():
        comm = comm.start()

    def changeValue(id, val):
        ....

    ....

您可以使用mock框架来完成这种工作。 首先你使用comm = Comm()MyClass ,这意味着你有类似from comm_module import CommMyClass的模块。 在这些情况下,您需要在MyClass的模块中修补Comm引用以使您的补丁处于活动状态。

因此,如何在不进行任何连接的情况下测试代码的示例可以是:

@patch("my_class.Comm", autospec=True)
def test_base(self, mock_comm_factory):
    mock_comm = mock_comm_factory.return_value
    MyClass()
    mock_comm.start.assert_called_with()

@patch("my_class.Comm", autospec=True)
def test_changeValue(self, mock_comm_factory):
    mock_comm = mock_comm_factory.return_value
    mock_comm.getval.return_value = 13
    MyClass().changeValue(33, 23)
    mock_comm.getval.assert_called_with(33)
    mock_comm.send.assert_called_with(33, 23)
    mock_comm.reset_mock()
    mock_comm.getval.return_value = 23
    MyClass().changeValue(33, 23)
    mock_comm.getval.assert_called_with(33)
    self.assertFalse(mock_comm.send.called)

现在我可以开始解释我的答案的所有细节,例如为什么使用autospec=True如何将补丁应用于所有方法,但这意味着重写大量的mock文档和SO答案。 所以我希望这足以作为起点。

诀窍是不要使用像comm这样的全局对象。 如果可以,请将其设置为调用者将comm注入您的类或方法。 那么你所做的就是在测试时传递一个模拟的comm ,然后在生产时传递一个真实的comm

所以要么你在类中使用comm引用一个字段(并通过构造函数或setter方法注入它),就像这样

class myClass:

  ....
  def __init__(myComm):
    comm = myComm;
    comm = comm.start()

  def changeValue(id, val):
    current_value = comm.getval(id)
    if (current_value != val):
      comm.send(id, val)

....

或者你在使用它的方法中使它成为一个参数,就像这样

def changeValue(id, val, myComm):
current_value = myComm.getval(id)
if (current_value != val):
    myComm.send(id, val)

使用全局任何东西都会让模拟成为一个巨大的痛苦,每当你需要模拟一些东西时,尝试使用依赖注入

这是关于DI的另一篇好文章。 它在java中,但在python中应该是相同的http://googletesting.blogspot.ca/2008/07/how-to-think-about-new-operator-with.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM