使用mock和patch对webapp2进行单元测试时的请求问题

时间:2016-04-21 16:50:24

标签: python-2.7 unit-testing google-app-engine mocking

我正在为这个webapp2处理程序构建单元测试(为GAE构建)

    class PushNotificationHandler(webapp2.RequestHandler):
        def post(self):
            UserNotification.parse_from_queue(self.request)
            return

    app = webapp2.WSGIApplication([
        (r'/push/notification', PushNotificationHandler),
    ], debug=True)

一项测试是

    @patch.object(UserNotification, 'parse_from_queue')
    def test_post_webapp(self, p_parse_from_queue):
        response = webtest.TestApp(app).post('/push/notification')
        eq_(response.status_int, 200)
        p_parse_from_queue.assert_called_once_with(response.request)

HTTP回复没问题,但模拟断言失败了:

    Expected call: parse_from_queue(<TestRequest at 0x105a89850 POST http://localhost/push/notification>)
    Actual call: parse_from_queue(<Request at 0x105a89950 POST http://localhost/push/notification>)

我无法理解为什么请求不正确(看起来像深层拷贝)。单元测试有什么问题,或者是webapp2处理请求的方式。在第二种情况下,有没有办法对其进行测试,而无需创建单独的测试来测试PushNotificationHandler.post()

由于

1 个答案:

答案 0 :(得分:0)

我在类似的情况下使用过mock call_args。你可以这样做:

request = p_parse_from_queue.call_args[0][0]
self.assertEqual(request.url, "foo")
self.assertEqual(request.*, *)

[0][0]给出第一个传递的参数,假设您使用的是有序参数而不是关键字参数。

然后,您可以继续检查request对象的其他相关属性,以确保其行为符合预期。