2017-02-14 58 views
4

我试图学习Python和嘲讽基础设施的Python在同一时间(由于要求在我的工作地点)。我还应该提及,我对C++或任何其他语言的嘲笑功能也不熟悉。newbiee查询:蟒蛇嘲弄

到目前为止,从我所了解的是,通过嘲笑,我可以锻炼使操作系统的应用程序代码。网络等相关的调用,而没有实际调用这些操作。

比方说,我的应用程序,实现为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嘲讽(模拟需要安装一个单独的模块)

+0

你检查了这个:https://medium.com/@echohack/python-unit-testing-injecting-exceptions-with-mock-and-nose-e46bf579c867#.gnrot0dlu –

回答

1

network.py中打印出一个字符串。如果你反而会打印出实际的错误,你会看到失败的原因。在这种情况下你会看到它由于AttributeError而失败。 AttributeError("'bool' object has no attribute 'close'",)

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

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

这样你就可以早些发现它。

+0

“mock_sock.return_value = None”工作,并且还将正面测试更改为“self.assertRegexpMatches(reference.sock_create(),”closed socket“,msg =”未能调用关闭“)”工作。 – Amit

+0

@amit,你应该在单元测试中做什么,尽管它与实际代码中发生的行为相匹配。在创建它时,套接字在什么情况下会失败? – Jonathan