Потребительский тест PACT .NET: гибкий массив длин

Я использую pactNet для тестирования API, который должен возвращать массив гибкой длины.

Если я назову "myApi/items/", он должен вернуть список предметов, где потребитель не знает точного размера. Так что ответ должен выглядеть так:

    [
        {
            "id": "1",
            "description": "foo"
        },
        {
            "id": "2",
            "description": "foo2"
        },
        {
            "id": "3",
            "description": "foo3"
        }
    ]

или это:

    [
        {
            "id": "4",
            "description": "foo4"
        },
        {
            "id": "2",
            "description": "foo2"
        }
    ]

Как мне создать контракт для этого взаимодействия?

В документации приведен пример в Ruby, но я не могу найти эквивалент в C#.

Я использую pactNet версии 2.1.1.

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

[Test]
    public void GetAllItems()
    {
        //Arrange
        _mockProviderService
            .Given("There are items")
            .UponReceiving("A GET request to retrieve the items")
            .With(new ProviderServiceRequest
            {
                Method = HttpVerb.Get,
                Path = "/items/",
                Headers = new Dictionary<string, object>
                {
                    { "Accept", "application/json" }
                }
            })
            .WillRespondWith(new ProviderServiceResponse
            {
                Status = 200,
                Headers = new Dictionary<string, object>
                {
                    { "Content-Type", "application/json; charset=utf-8" }
                },
                Body = // array of items with some attributes
                       // (somthing like: {"id": "2", "description": "foo"}) 
                       // with flexible length
            });

        var consumer = new ItemApiClient(_mockProviderServiceBaseUri);

        //Act
        var result = consumer.GetItems();

        //Assert
        Assert.AreEqual(true, result.Count > 0);

        _mockProviderService.VerifyInteractions();

        data.Dispose();
    }

1 ответ

Решение

Похоже, вы ищете MinTypeMatcher.

Часть тела будет выглядеть примерно так:

Body = Match.MinType(new { id: "1", description: "foo" }, 1)

Для сценария вложенного массива, такого как запрос @SlimSjakie, просто повторите Match.MinType для свойства, имеющего массив. Например, следующий объект Person имеет свойство Address в виде массива.

Person = Match.MinType(new
{
    FirstName = Match.Type("string"),
    LastName = Match.Type("string"),
    Address = Match.MinType(new
    {
        Street = Match.Type("string"),
        Town = Match.Type("string"),
        State = Match.Type("string"),
        Postcode = Match.Type("string"),
        Country = Match.Type("string")
    }, 1)
}, 1)

Итак, что, если я хочу сопоставить тип объекта, у которого есть свойство, которое является списком или массивом?

если вы выполните Match.Type(new myType()) и количество элементов в массиве или свойстве списка не совсем то же самое, тест завершится неудачно. Вы увидите такую ​​ошибку:

Description of differences
--------------------------------------
* Actual array is too long and should not contain a Hash at $.data.itinerary[2]
Другие вопросы по тегам