python - 新手查询: mocking in python

标签 python python-2.7 unit-testing mocking

我正在尝试同时学习 Python 和 Python 中的模拟基础设施(由于我工作场所的要求)。我还应该提到,我也不熟悉 C++ 或任何其他语言中的模拟功能。

到目前为止,据我所知,通过模拟,我可以练习制作 OS 的应用程序代码。网络等相关调用,而不实际调用这些操作。

假设我有一个应用程序,实现为 network.py

#!/usr/bin/env python

import sys
import socket

class NetworkService(object):
    def sock_create(self):
        try:
            s = socket.socket()
            s.close()
            print "closed socket"
        except Exception, err:    
            print "error creating socket"
            sys.exit(1) 

我希望通过单元测试实现的目标是:

  1. 确保测试正常路径和故障路径。

在这种情况下,为了实现这一点,我试图提出一个示例单元测试用例,该用例使用 sock_create 方法,如下所示:

#!/usr/bin/env python

import unittest
import mock
from network import NetworkService

class NetworkServiceTest(unittest.TestCase):
    @mock.patch('network.socket')
    def test_01_sock_create(self, mock_sock):
        reference = NetworkService()
        mock_sock.return_value = False
        # NetworkService::sock_create::s.close() should NOT get called  
        reference.sock_create()
        self.assertFalse(mock_sock.close.called, "Failed to not call close")

        mock_sock.socket.return_value = True
        # NetworkService::sock_create::s.close() should get called
        reference.sock_create()
        # how to test this ???
        #mock_sock.close.assert_called_with("")

if __name__ == '__main__':
    unittest.main()

正如您在上面看到的,最后一个“断言”语句目前已被注释掉;我不确定,如何检查这个?以下给我错误:

#!/usr/bin/env python

import unittest
import mock
from network import NetworkService

class NetworkServiceTest(unittest.TestCase):
    @mock.patch('network.socket')
    def test_01_sock_create(self, mock_sock):
        reference = NetworkService()
        mock_sock.return_value = False
        reference.sock_create()
        self.assertFalse(mock_sock.close.called, "Failed to not call close")

        mock_sock.socket.return_value = True
        reference.sock_create()
        self.assertTrue(mock_sock.close.called, "Should have called s.close")

if __name__ == '__main__':
    unittest.main()

和错误:

$ python tester.py
F
======================================================================
FAIL: test_01_sock_create (__main__.NetworkServiceTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/mock/mock.py", line 1305, in patched
    return func(*args, **keywargs)
  File "tester.py", line 17, in test_01_sock_create
    self.assertTrue(mock_sock.close.called, "Should have called s.close")
AssertionError: Should have called s.close

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (failures=1)
closed socket
error creating socket

注意我在 Python 2.7 中使用模拟(模拟需要作为单独的模块安装)

最佳答案

network.py 中,您正在打印一个字符串。相反,如果您打印出实际错误,您会看到它失败的原因。在这种情况下,您会看到它因 AttributeError 而失败。 AttributeError("'bool' 对象没有属性 'close'",)

发生这种情况的原因是因为您为模拟对象提供了 TrueFalse 的返回值。由于 bool 没有任何打开或关闭方法,因此它会抛出该错误。

其他一些提示。您正在使用 Exception 来捕获所有异常。相反,只捕获您知道会发生的异常。找出套接字可能抛出的异常。

这样你就会更早发现这一点。

关于python - 新手查询: mocking in python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42237939/

相关文章:

python - 控制台速度 : PyCharm vs Spyder

python - 如何合并这两列? Pandas

java - 与项目 'com.android.support:support-media-compat' 中的依赖项 ':app' 冲突

python - 使用 python 查找以特定名称开头的目录?

python - 选择 "other value"的通用方法

unit-testing - 如何用 PHPUnit 模拟这些方法?

java - PowerMockito:java.lang.NoClassDefFoundError

python - 如何在sql命令中使用python变量

python - 输入记录与 python mapreduce 中的输出记录不匹配

python-2.7 - 使用蒙版获取图像的平均值