Тест PactNet Provider не пройден из-за 404 при запуске теста

У меня есть потребитель, который успешно создал файл пакта:

{
  "consumer": {
    "name": "CakeService"
  },
  "provider": {
    "name": "CoolPersonService"
  },
  "interactions": [
    {
      "description": "A GET request to get a person who is cool",
      "providerState": "There is a person who has IsCool set to 'true'6",
      "request": {
        "method": "get",
        "path": "/CoolPersonService/persons/e674a2d0-57e6-471d-96dd-a91c0077283a",
        "headers": {
          "X-Requested-With": "XMLHttpRequest",
          "CallerName": "Pact_Test@Local"
        }
      },
      "response": {
        "status": 200,
        "headers": {
          "Content-Type": "application/json; charset=utf-8"
        },
        "body": {
          "FirstName": "Some",
          "LastName": "Name",
          "IsCool": true
        }
      }
    }
  ],
  "metadata": {
    "pactSpecification": {
      "version": "2.0.0"
    }
  }
}

Проблема в тесте для провайдера. Он получает 404 за

/CoolPersonService/ человек /e674a2d0-57e6-471d-96dd-a91c0077283a

но если я отправлю GET на этот маршрут с помощью HTTP-клиента, я получу ответ 200, и ожидаемые данные будут возвращены.

Вот результат теста:

Test Name:  EnsureSomethingApiHonoursPactwithConsumer
Test Outcome:   Failed
Result Message: 
Test method PactTests.PactTests.EnsureSomethingApiHonoursPactwithConsumer threw exception: 
PactNet.PactFailureException: Pact verification failed. See output for details. 
If the output is empty please provide a custom config.Outputters (IOutput) for your test framework, as we couldn't write to the console.
Result StandardOutput:  
[2018-07-13 10:59:05] INFO  WEBrick 1.3.1
[2018-07-13 10:59:05] INFO  ruby 2.2.2 (2015-04-13) [i386-mingw32]
..........++++++
..........++++++
[2018-07-13 10:59:07] INFO  
[2018-07-13 10:59:07] INFO  WEBrick::HTTPServer#start: pid=109760 port=9222
[2018-07-13 10:59:07] ERROR Errno::ECONNRESET: An existing connection was forcibly closed by the remote host.
    C:/redacted/PactTests/bin/Debug/pact-win32/lib/ruby/lib/ruby/2.2.0/openssl/buffering.rb:61:in `sysread'
    C:/redacted/PactTests/bin/Debug/pact-win32/lib/ruby/lib/ruby/2.2.0/openssl/buffering.rb:61:in `fill_rbuff'
    C:/redacted/PactTests/bin/Debug/pact-win32/lib/ruby/lib/ruby/2.2.0/openssl/buffering.rb:301:in `eof?'
    C:/redacted/PactTests/bin/Debug/pact-win32/lib/vendor/ruby/2.2.0/gems/webrick-1.3.1/lib/webrick/httpserver.rb:80:in `run'
    C:/redacted/PactTests/bin/Debug/pact-win32/lib/vendor/ruby/2.2.0/gems/webrick-1.3.1/lib/webrick/server.rb:191:in `block in start_thread'
INFO: Reading pact at C:/redacted/PactTests/Pacts/cakeservice-coolpersonservice.json

Verifying a pact between CakeService and CoolPersonService
  Given There is a person who has IsCool set to 'true'6
    A GET request to get a person who is cool
      with GET /CoolPersonService/persons/e674a2d0-57e6-471d-96dd-a91c0077283a
        returns a response which
DEBUG: Setting up provider state 'There is a person who has IsCool set to 'true'6' for consumer 'CakeService' using provider state server at https://localhost/CoolPersonService/provider-states
I, [2018-07-13T10:59:11.805597 #102868]  INFO -- request: POST https://localhost/CoolPersonService/provider-states
D, [2018-07-13T10:59:11.805597 #102868] DEBUG -- request: User-Agent: "Faraday v0.15.0"
Content-Type: "application/json"
I, [2018-07-13T10:59:23.352124 #102868]  INFO -- response: Status 200
D, [2018-07-13T10:59:23.352625 #102868] DEBUG -- response: content-type: "application/json; charset=utf-8"
server: "redacted"
x-powered-by: "redacted"
date: "Fri, 13 Jul 2018 08:59:23 GMT"
connection: "close"
content-length: "84"
          has status code 200 (FAILED - 1)
          has a matching body (FAILED - 2)
          includes headers
            "Content-Type" which equals "application/json; charset=utf-8" (FAILED - 3)

Failures:

  1) Verifying a pact between CakeService and CoolPersonService Given There is a person who has IsCool set to 'true'6 A GET request to get a person who is cool with GET /CoolPersonService/persons/e674a2d0-57e6-471d-96dd-a91c0077283a returns a response which has status code 200
     Failure/Error: expect(response_status).to eql expected_response_status

       expected: 200
            got: 404

       (compared using eql?)

  2) Verifying a pact between CakeService and CoolPersonService Given There 

is a person who has IsCool set to 'true'6 A GET request to get a person who is cool with GET /CoolPersonService/persons/e674a2d0-57e6-471d-96dd-a91c0077283a returns a response which has a matching body

>Failure/Error: expect(response_body).to match_term expected_response_body, diff_options, example
         Encoding::UndefinedConversionError:
           "\xC3" from ASCII-8BIT to UTF-8
      3) Verifying a pact between CakeService and CoolPersonService Given There is a person who has IsCool set to 'true'6 A GET request to get a person who is cool with GET /CoolPersonService/persons/e674a2d0-57e6-471d-96dd-a91c0077283a returns a response which includes headers "Content-Type" which equals "application/json; charset=utf-8"
         Failure/Error: expect(header_value).to match_header(name, expected_header_value)
           Expected header "Content-Type" to equal "application/json; charset=utf-8", but was "text/html; charset=utf-8"
    1 interaction, 1 failure
    Failed interactions:
    To re-run just this failing interaction, change the verify method to '.Verify(description: "A GET request to get a person who is cool", providerState: "There is a person who has IsCool set to 'true'6")'. Please do not check in this change! # A GET request to get a person who is cool given There is a person who has IsCool set to 'true'6

Вот метод испытания для провайдера:

[TestMethod]
[TestCategory("Pact")]
public void EnsureSomethingApiHonoursPactwithConsumer()
{
    const string serviceUri = "https://localhost/CoolPersonService";

    var config = new PactVerifierConfig
    {
        Verbose = true
    };

    IPactVerifier pactVerifier = new PactVerifier(config);
    pactVerifier
        //.ProviderState($"{serviceUri}/provider-states")
        .ProviderState($"{serviceUri}/provider-states")
        .ServiceProvider("CoolPersonService", serviceUri)
        .HonoursPactWith("CakeService")
        .PactUri(@"C:\repos\Pact\API_CoolPersonService\PactTests\Pacts\cakeservice-coolpersonservice.json")
        .Verify();
}

1 ответ

Если вы делаете GET для ресурса, и вы получаете 404, для меня это звучит так, как будто ожидаемых данных нет на сервере - и это означает, что состояние провайдера не было установлено правильно.

Пожалуйста, прочитайте о состоянии провайдера здесь https://docs.pact.io/getting-started/provider-states и здесь https://docs.pact.io/implementation-guides/ruby/provider-states

Если вы выполняете POST по тому же маршруту и ​​получаете ответ, который вы ожидали от GET, возможно, вы только что создали новый ресурс, и он возвращает тело вновь созданного ресурса.

Я вижу, что у вас также есть некоторые проблемы с кодировкой (Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8Я полагаю, что это было исправлено в последней версии базовой библиотеки (называемой "pact standalone"), поэтому, пожалуйста, убедитесь, что у вас установлена ​​последняя версия pact-net. Если у вас уже установлена ​​последняя версия pact-net, пожалуйста, поднимите вопрос об обновлении автономной версии.

Для тех, кто все еще не понимает этого вопроса, "\xC3" from ASCII-8BIT to UTF-8 ошибка также возникает из-за того, что ответ вашего провайдера не может быть закодирован, например, ваш провайдер возвращает 500 с ответом text/html.

Другие вопросы по тегам