6

我目前正在尝试用apiary.io. 系统通过登录请求实现身份验证,该请求返回包含会话 ID 的 http-cookie。

据我所知,浏览器在发出另一个请求时将他之前从主机收到的所有 http-cookie 发送回他是标准的。

看来,在运行由我的蓝图文件生成的测试时,这不是 Dredd 完成的。因此,任何需要用户登录的请求都无法正常进行测试。

是否有可能将请求分别标记为“在运行此请求之前需要”以强制 Dredd 管理这些 http-cookies?

顺便说一句,REST 服务是在Sails.js.mvc 框架中实现的node.js

4

2 回答 2

1

这很旧,但我刚刚遇到了同样的问题,并且 dredd 文档已经过时了(这不是很讽刺吗?!),所以既然我发现这可能会对某人有所帮助:)

您可以使用钩子读取和覆盖响应和请求正文和标头(这是我在该主题上找到的最新页面,但仍有问题和拼写错误)。需要注意的是,dredd 似乎没有 cookie 助手,因此您必须自己解析和构建 cookie 标头。

在我的情况下,sessionId它以 json 正文和 cookie 的形式返回:我解析了正文,因为这更容易,但如果需要,您可以很好地从响应 cookie 中检索会话。以下是我为使身份验证工作而编写的大致钩子:

hooks = require('hooks');
stash = {}

// hook to retrieve session on a login
hooks.after('Auth > /remoteauth/userpass > POST', function(transaction){
  stash['token'] = JSON.parse(transaction.real.body)['sessionId'];
});

// hook to set the session cookie in all following requests
hooks.beforeEach(function(transaction){
  if(stash['token'] != undefined){
    transaction.request['headers']['Cookie'] = "id=" + stash['token']
  };
});

文档解释了如何设置挂钩,尽管让我感到困惑的一件事是,dredd --names如果您在同一目录中有文件,该命令将不起作用dredd.yml(似乎该文件的存在使 dredd 忽略所有命令行参数)。

于 2015-05-09T01:46:01.140 回答
0

Dredd 旨在针对测试环境设置运行,例如在带有测试装置的 CI 工具中。它不应该在生产环境中运行。

话虽如此,在测试端点时可能偶尔需要执行设置或拆卸操作。计划最终提供测试场景

如果您需要设置/拆卸功能,您可以使用此处讨论的 Dredd“钩子” 。

于 2014-05-12T20:38:48.383 回答