def test_call_send_request_with_right_arguments(self): # 检测调用send_request的时候的参数是str client.send_request = mock.Mock() client.visit_ustack() self.assertEqual(client.send_request.called, True) call_args = client.send_request.call_args self.assertIsInstance(call_args[0][0], str)
def test_success_request_with_patch(self): status_code = '200' success_send = mock.Mock(return_value=status_code) # 使用了patch函数(作为上下文管理器使用)。 with mock.patch('client.send_request', success_send): from client import visit_ustack self.assertEqual(visit_ustack(), status_code)
def test_patch_func2(self): status_code = '404' fail_send = Mock(return_value=status_code) import client with patch.object(client, 'send_request', fail_send): from client import visit_ustack self.assertEqual(visit_ustack(), status_code)
def test_success_request(self): print 'start test_success_request' # 声明mock函数 success_send = mock.Mock(return_value='200') # 假设client的send_request得到的回值就是success_send client.send_request = success_send # 调用被测试函数 self.assertAlmostEqual(client.visit_ustack(), '200')
def test_success_request(self): success_send = mock.Mock(return_value='200') # 实例化Mock类得到一个mock对象,并且设置这个mock对象的行为。 # 在成功测试中,我们设置mock对象的返回值为字符串“200”, # 在失败测试中,我们设置mock对象的返回值为字符串"404"。 client.send_request = success_send # 用这个mock对象替换掉我们想替换的对象, client.send_request self.assertEqual(client.visit_ustack(), '200')
def test_call_send_request_with_right_arguments(self): """ Mock对象的called属性表示该mock对象是否被调用过。 Mock对象的call_args表示该mock对象被调用的tuple,tuple的每个成员都是一个mock.call对象。mock.call这个对象代表了一次对mock 对象的调用,其内容是一个tuple,含有两个元素,第一个元素是调用mock对象时的位置参数(*args),第二个元素是调用mock对象时的关键字 参数(**kwargs)。 现在来分析下上面的用例,我们要检查的项目有两个: visit_ustack()调用了send_request() 调用的参数是一个字符串 :return: """ client.send_request = mock.Mock() client.visit_ustack() self.assertEqual(client.send_request.called, True) call_args = client.send_request.call_args self.assertIsInstance(call_args[0][0], str)
def test_fail_request(self): fail_send = mock.Mock(return_value='404') client.send_request = fail_send self.assertEqual(client.visit_ustack(), '404')
def test_call_send_request_with_right_arguments(self): client.send_request = mock.Mock() client.visit_ustack() self.assertEqual(client.send_request.called, True) call_args = client.send_request.call_args self.assertIsInstance(call_args[0][0], str)
def test_success_request(self): status_code = '200' from client import visit_ustack self.assertEqual(visit_ustack(), status_code)
def test_patch_func(self): status_code = '404' fail_send = Mock(return_value=status_code) with patch('client.send_request', fail_send): self.assertEqual(visit_ustack(), status_code)
def test_success_request(self): status_code = 200 success_send = mock.Mock(return_value=status_code) with mock.patch('client.send_request', success_send): # 这里解设导入的 client 模块,里面有一个 send_request 函数 from client import visit_ustack # 这里解设导入的 client 模块,里面有一个 visit_ustack 函数 self.assertEqual(visit_ustack(), status_code)
def test_fail_request_with_patch(self): status_code = '404' fail_send = mock.Mock(return_value=status_code) with mock.patch('client.send_request', fail_send): from client import visit_ustack self.assertEqual(visit_ustack(), status_code)
def test_success_request(self): success_send = mock.Mock(return_value='200') client.send_request = success_send self.assertEqual(client.visit_ustack(), '200')
def test_fail_request_with_patch_obj(self): status_code = '404' fail_send = mock.Mock(return_value=status_code) with mock.patch.object(client, 'send_request', fail_send): from client import visit_ustack self.assertEqual(visit_ustack(), status_code)
上面的 return_value 参数用法,也许你看不出有什么用,下面例子会让你明白它的真正用处。 举个例子来说:我们有一个简单的客户端实现,用来访问一个URL,当访问正常时,需要返回状态码200,不正常时,需要返回状态码404。 首先,我们的客户端代码实现如下: import requests class Client(): def send_request(self, url): r = requests.get(url) return r.status_code def visit_ustack(self): return self.send_request('http://www.ustack.com') 外部模块调用 visit_ustack() 来访问 UnitedStack 的官网。 下面我们使用 mock 对象在单元测试中分别测试访问正常和访问不正常的情况。 import unittest import mock class TestClient(unittest.TestCase): def test_success_request(self): success_send = mock.Mock(return_value=200) clent = Client() # 需导入上面说的 客户端代码 里面的 Client clent.send_request = success_send self.assertEqual(clent.visit_ustack(), 200) def test_fail_request(self): fail_send = mock.Mock(return_value=404)
def test_fail_request(self): print 'start test_fail_request' faile_send = mock.Mock(return_value='404') client.send_request = faile_send self.assertAlmostEqual(client.visit_ustack(), '404')
def test_fail_request(self): status_code = 404 fail_send = mock.Mock(return_value=status_code) with mock.patch.object(client, 'send_request', fail_send): from client import visit_ustack self.assertEqual(visit_ustack(), status_code)
def test_success_request(self): status_code = '200' success_send = Mock(return_value=status_code) with patch('client.send_request', success_send): from client import visit_ustack self.assertEqual(visit_ustack(), status_code)