从中间方法返回的Python Unittest值

时间:2018-07-02 20:43:42

标签: python unit-testing flask mocking

我有一个Flask应用程序,该应用程序公开了一个需要发布值的方法。在此端点中,我获取请求数据并创建一个发送到Kafka的事件。根据请求值包含的内容,事件是不同的。我想编写一系列测试,以验证创建事件的方法是否按预期工作。没有大量细节,这是网关资源的基本结构。

class Gateway(Resource):
    def build_event(self, request):
        event = {
            "key": uuid4(),
            "source_ip": request.remote_addr,
            "payload_checksum": = haslib.md5(request.data).hexdigest(),
            ...
        }
        if request.data['some-key']:
             event["key-specific-value"] = "foo"
        else:
             event["key-specific-value"] = "bar"


    def post(self):
        event = self.build_event(request)
        kafka_producer.send(event)       

我想编写一些测试以允许我调用post方法,并验证从build_event返回的事件是否正确。 如何在单元测试中检查从build_event返回的结构的值?

1 个答案:

答案 0 :(得分:0)

尽量不要在一个测试用例中测试多种方法。为post编写一个模拟self.build_eventkafka_producer.send的测试。然后,编写另一个仅调用build_event的测试用例,并检查其返回值。

要回答您的原始问题,您可以创建一个模拟对象,并将其作为您的请求参数传入,如下所示:

def test_build_event(self):
    mock_request = mock.Mock(remote_addr='some remote address', data={'some-key': False})
    gateway = Gateway()
    event_return_val = gateway.build_event(mock_request)
    self.assertEqual(event_return_val['key-specific-value'], 'bar')
    self.assertTrue('key' in event_return_val)

您会变得更加复杂,并且mock.patchuuid4()的调用也是如此。这样一来,您就可以与返回的hashlib.md5()和修补的返回值中的确切值进行比较。首先,您可以检查密钥是否像上面的情况一样存在。