为多个响应集测试相同的API

时间:2017-06-02 14:20:01

标签: javascript node.js rest microservices pact

我们一直在尝试测试从微服务(比如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
            }
          })
        })

我们无法在测试中找到区分这些相互作用的方法! :(

任何帮助将不胜感激!

感谢。

1 个答案:

答案 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()