我正在使用协约宝石(而且很喜欢它!)我的合同测试套件。我正在测试的API服务对所有请求都需要一个授权令牌。
我知道如何为我的用户生成一个API令牌,但我不知道如何将令牌放在契约工作流中。我搜索了契约文档和回购,但没有任何运气。
我试图在使用者规范中发送一篇文章来生成令牌,但是consumer模拟服务器不知道如何处理请求和错误(正如我所期望的)。
我找到了这个例子,它似乎很有希望,特别是能够使用requestFilter和addHeader方法为所有请求分配预定义的头。
我如何使用这样的请求筛选器与契约创业板?
如果这不是一个当前的功能,我有什么选择?
更新:
X的回答对于创建与模拟服务器的契约非常有用,但它并不能满足API服务提供者对有效的auth令牌的期望。更具体地说,在运行pact时,我需要动态地将有效的auth令牌插入到契约中:验证。因此,再近一步,但仍需弄清楚后半部分。
马修的回答包含一些提示,为后面的部分提供了两种可能的解决方案(pact:验证)。我不太愿意引入另一个依赖项,所以我很想让ProxyApp类示例正常工作。但是,我不知道我到底会把什么传递到ProxyApp.new()中。有什么建议吗?
发布于 2016-11-24 03:55:31
实际上,除非您真的想/需要,否则您不必为每个契约交互使用真正的令牌。
通常,对于这类内容,我只需创建一个正则表达式,用于在标题上验证某些规则,同时保持其“打开”。在我的节点项目(在后面使用Ruby二进制文件)中,我创建了这2个实用程序函数来创建具有模式的对象,并为对象最小值创建另一个函数:
function term(matcher, generate) {
if ((typeof matcher === 'undefined') || (typeof generate === 'undefined')) {
throw 'Matcher and Generate arguments must be specified to use Term';
}
return {
"json_class": "Pact::Term",
"data": {
"generate": generate,
"matcher": {
"json_class": "Regexp",
"o": 0,
"s": matcher
}
}
};
}
function somethingLike(value) {
return {
"json_class": "Pact::SomethingLike",
"contents": value
};
}然后,您可以在DSL定义中使用它,如下所示:
mockService
.given('a form')
.uponReceiving('a GET request with a valid auth')
.withRequest('get', '/', term('^Bearer (?!null$).+$', 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ'))
.willRespondWith({
status: 200,
headers: {'Content-Type': 'application/json;charset=utf-8'},
body: {worked:true}
});“术语”实用程序有一个正则表达式作为第一个参数,然后是测试期间使用的示例(应该与第一个参数匹配)。
我知道,需要在“契约”本身内更好地扩大这一范围,使其更易于使用。我希望这能帮到你。
发布于 2016-11-24 21:36:39
契约的Ruby实现并不像JVM实现那样直接支持这一点。
如果您正在使用,您可以查看https://github.com/realestate-com-au/pact/issues/49#issuecomment-65346357和https://groups.google.com/forum/#!topic/pact-support/tSyKZMxsECk中讨论的一些选项。
一个例子看起来可能类似于:
class ProxyApp
def initialize real_app
@real_app = real_app
end
def call env
@real_app.call(env.merge('HTTP_AUTHORIZATION' => '12345'))
end
end
Pact.service_provider "Some Provider" do
app do
ProxyApp.new(RealApp)
end
honours_pact_with "Some Consumer" do
#...
end
endhttps://stackoverflow.com/questions/40777493
复制相似问题