Specflow читает ответ Json - PullRequest
       36

Specflow читает ответ Json

1 голос
/ 14 марта 2019

Нужно проверить GET, в ответе которого есть Json. Я не нашел полезной информации в официальной документации.

Feature: API_Retrieving_Platforms
    As an authorized user...
 @mytag
Scenario: Perform Get request
    Given I am an authorized user
    When I perform GET request "/api/hotels/lists/platforms",
    Then I receive a JSON in response:
    """
    [
        {
            "refId": 1,
            "label": "Mobile"
        },
        {
            "refId": 2,
            "label": "Desktop"
        }
    ]
    """

Шаг для получения Json:

[Then(@"I receive a JSON in response:")]
    public void ThenIReceiveAJSONInResponse(string JSON)
    {
        Assert.Equal(HttpStatusCode.OK, _responseMessage.StatusCode);
    }

Как разобрать это? enter image description here

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Короче говоря: Вы ошибаетесь .

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

Scenario: Retriving a list of platforms
    Given I am an authorized user
    When I retrieve a list of hotel platforms
    Then I should receive the following hotel platforms:
        | Platform |
        | Mobile   |
        | Desktop  |

Шаг: когда я получаю список гостиничных платформ

Этот шаг должен сделать запрос GET в коде C #.Сохраните ответ на этот запрос GET в контексте сценария.

Шаг: Затем я должен получить следующие гостиничные платформы:

Делает простое утверждение и опускает техническую информациюкак "Ref Id".Имя платформы - это все, что вас действительно волнует.

Грубое начало этих шагов будет следующим:

using TechTalk.SpecFlow;
using TechTalk.SpecFlow.Assist;

[Binding]
public class PlatformSteps
{
    private readonly ScenarioContext scenario;

    public PlatformSteps(ScenarioContext scenario)
    {
        this.scenario = scenario;
    }

    [When(@"^When I retrieve a list of hotel platforms")]
    public void WhenIRetrieveAListOfHotelPlatforms()
    {
        var response = api.GetHotelPlatforms(); // Or whatever you API call looks like

        scenario["HotelPlatformsResponse"] = response;
    }

    [Then(@"^I should receive the following hotel platforms:")]
    public void IShouldReceiveTheFollowingHotelPlatforms(Table table)
    {
        var response = (IEnumerable<SomeJsonResponseType>)scenario["HotelPlatformsResponse"];
        var actualPlatforms = response.Select(r => r.PlatformName);

        table.CompareToSet(actualPlatforms);
    }
}
0 голосов
/ 14 марта 2019

Один из способов улучшить это - не указывать точный JSON в шаге Specflow.Я бы предложил использовать что-то вроде

Then I receive a response that looks like 'myResponsefile.json'

Затем вы можете создать шаг, который обрабатывает ответ и просматривает файл в вашем репо, чтобы сравнить его с

[Then(@"I receive a response that looks like '(.*)'")]
public void IreceiveAJsonResponse(string responsefilenametocompare)
{
        string receivedjson = GetMyReceivedjsonObject();
        string filePathAndName = "myfile.json";
        string json = File.ReadAllText(filePathAndName); 

        JToken expected = JToken.Parse(json);
        JToken actual = JToken.Parse(receivedjson);

        actual.Should().BeEquivalentTo(expected);
}
...