我们一直在尝试测试从微服务(比如GET / contacts)暴露的API,这是由另一个微服务使用的。
为了避免集成测试,我们创建了消费者驱动的合同测试,其中消费者微服务创建了契约并将它们发布到代理,生产者将分别验证协议。
我们已经使用Pact IO来实现这一目标,到目前为止它已经相当不错了。
现在我们在尝试进行详尽的测试时遇到问题,我们希望看看如何从GET /联系人返回空列表。
问题是:在添加交互时,我们可以使用提供者状态,但是我们找不到区分编写测试的方法,用于从GET /联系人获取联系人列表一次,并在另一个测试中获取空列表。 / p>
这就是我们在消费者微服务中创建契约测试的方法:
mockServer.start()
.then(() => {
provider = pact({
// config
})
return provider.addInteraction({
state: 'Get all contacts',
uponReceiving: 'Get all contacts',
withRequest: {
method: 'GET',
path: '/contacts',
headers: {
Accept: 'application/json; charset=utf-8'
}
},
willRespondWith: {
status: 200,
body: //list of all contacts
}
})
.then(() => {
return provider.addInteraction({
state: 'Get empty list of contacts',
uponReceiving: 'Get empty list of contacts',
withRequest: {
method: 'GET',
path: '/contacts',
headers: {
Accept: 'application/json; charset=utf-8'
}
},
willRespondWith: {
status: 200,
body: [] // empty list
}
})
})
我们无法在测试中找到区分这些相互作用的方法! :(
任何帮助将不胜感激!
感谢。
答案 0 :(得分:1)
假设您正在使用像Mocha这样的东西,您应该将这些互动分成单独的测试 - 例如在每个addInteraction
块中调用describe
与您正在运行的测试用例相关的内容(可能在before
中,以使您的测试更加清晰)。
您的一般结构可能如下所示(伪代码):
context("Contacts exist")
describe("call some API")
before()
provider.addInteraction(interactionWithContacts)
it("Returns a list of contact objects")
# your test code here
# Verify - this will also clear interactions so
# your next test won't conflict
provider.verify()
context("No contacts exist")
describe("call some API")
before()
provider.addInteraction(interactionWithNoContacts)
it("Returns an empty list of contacts")
# your test code here
# Verify - this will also clear interactions so
# your next test won't conflict
provider.verify()