Python 龙卷风中的单元测试

Python 龙卷风中的单元测试,python,unit-testing,tornado,Python,Unit Testing,Tornado,我正在tornado.web中使用mongodb作为后端构建一个简单的web应用程序。90%的服务器端代码库存在于一组RequestHandler中,90%的数据对象是json。因此,测试处理程序的基本用例是: "Given Request Y and DB in state X, verify that handler method Z returns json object J" 我如何设置这种测试 我发现了一些关于这个主题的博客文章和讨论线索,但它们主要关注于设置异步。我找不到有关设置

我正在tornado.web中使用mongodb作为后端构建一个简单的web应用程序。90%的服务器端代码库存在于一组RequestHandler中,90%的数据对象是json。因此,测试处理程序的基本用例是:

"Given Request Y and DB in state X,
 verify that handler method Z returns json object J"
我如何设置这种测试

我发现了一些关于这个主题的博客文章和讨论线索,但它们主要关注于设置异步。我找不到有关设置正确类型的DB状态或GET/POST请求参数的任何信息


我通常会模拟输入,只测试输出。这是一个使用此模拟库的人为示例-。您必须模拟出正确的mongodb查询函数。我不知道你在用什么

from mock import Mock, patch
import json


@patch('my_tornado_server.mongo_db_connection.query')
def test_a_random_handler_returns_some_json(self, mock_mongo_query):

    request = Mock()
    # Set any other attributes on the request that you need
    mock_mongo_query.return_value = ['pink', 'orange', 'purple']

    application = Mock()
    handler = RandomHandler(application, request)
    handler.write = Mock()

    handler.get('some_arg')

    self.assertEqual(handler.write.call_args_list, json.dumps({'some': 'data'}))

让我们开始赏金吧。我也对这个问题感兴趣。我离线问了几个tornado开发人员这个问题,他们给我的答案是“非常困难”。更好的答案可能是“使用胖模型和瘦控制器”。控制器很难进行单元测试,但如果验证和对象操作逻辑存在于模型中,不管怎样,我们都可以测试它。模拟的问题是,如果我们必须更改db模式/存储,我们必须更改所有模拟。如果模拟的返回值是从定义db模式的任何地方派生出来的,则不会。我明白了,在这种情况下,我们不是在测试数据,这将由mongo实际返回。您必须调用一个函数来告诉您db的状态。您模拟该函数的返回值,并从db模式中派生该返回值的格式。也许您真正需要的是集成或功能测试方面的帮助?这听起来不像是真正的单元测试。如果是这样,我建议使用Selenium和Webdriver。非常容易使用