Как мне создать пакт / контракт, в котором указано, что необходимо проверять только наличие и тип свойств в ответе?

Я установил принадлежащий с пустым объектом, инициализированным из класса модели, вместо того, чтобы устанавливать его с помощью анонимного объекта, потому что я хочу повторно использовать класс модели и делать как можно меньше. Теперь я пытаюсь создать пакт / контракт, в котором указывается, что следует проверять только тип и наличие свойства в теле ответа, а не его точное значение.

Я уже сделал немного, но кажется, что проверка на стороне поставщика всегда завершалась ошибкой, если свойство модели имеет тип String (см. Нижнюю часть этого вопроса).

Могу я узнать, как это исправить?

Вот что у меня есть на данный момент:


Класс модели: Пользователь

      public class User
{
    public long id {get; set;}
    public string name { get; set; }
    public string dob { get; set; }
}

Код потребительского теста:

      [Fact]
public void GetUser()
{
    User user = new User();

    _mockProviderService
      .Given("There is a User")
      .UponReceiving("A GET request to retrieve the User")
      .With(new ProviderServiceRequest
      {
          Method = HttpVerb.Get,
          Path = "/rest/user/1",
          Headers = new Dictionary<string, object>
          {
              { "Accept", "application/json" }
          }
      })
      .WillRespondWith(new ProviderServiceResponse
      {
          Status = 200,
          Headers = new Dictionary<string, object>
          {
              { "Content-Type", "application/json" }
          },
          Body = Match.Type(user)
      }); ;//NOTE: WillRespondWith call must come last as it will register the interaction

    var consumer = new RestClient(_mockProviderServiceBaseUri);

    //Act
    var result = consumer.GetUser();
    //Assert
    Assert.IsType<User>(result.Result);

    _mockProviderService.VerifyInteractions(); //NOTE: Verifies that interactions registered on the mock provider are called at least once
}

Код проверки провайдера:

      [Fact]
public void TestProvider()
{
    var config = new PactVerifierConfig
    {
        Outputters = new List<IOutput>
        {
            new XUnitOutput(_outputHelper)
        },
        Verbose = true,
        CustomHeaders = new Dictionary<string, string>()
        {
            { "Accept","application/json" }
        }
    };

    IPactVerifier pactVerifier = new PactVerifier(config);
    pactVerifier
        .ServiceProvider(ProviderName, ProviderUri)
        .HonoursPactWith(Consumer)
        .PactUri($@"C:\Pacts\{Consumer}-{ProviderName}.json")
        .Verify();

}

Когда я запускаю тест Provider, я сталкиваюсь с такой ошибкой:

         Failure/Error: expect(response_body).to match_term expected_response_body, diff_options, example
   ...
   "user": {
   -    "name": NilClass,
   -    "dob": NilClass
   +    "name": String,
   +    "dob": String
   }

   Description of differences
   --------------------------------------
   * Expected nil but got a String ("Damien") at $.user.name
   * Expected nil but got a String ("12/04/2021") at $.user.dob

Обходной путь

Используйте AutoBogus или аналогичные инструменты для автоматической установки свойств объекта модели с правильными значениями, прежде чем он будет использован для создания пакта. Если все остальное не поможет, я бы изучил это решение.

0 ответов

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