You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C#遍历JSON同名子节点并编写SpecFlow断言绑定方法

SpecFlow NUnit Binding for Microservice Health Check Then Step

Got it, let's tackle this step binding for your microservice health check test. First, I noticed a small mismatch in your Feature file that'll cause SpecFlow to throw an error—your Examples table uses downstreamservice but your Then step references <nameoftheservice>. Let's fix that first, then dive into the C# binding code.

Step 1: Fix the Feature File

Align the parameter name in the Then step with the column name in your Examples table:

@uService
Feature: Micro Service - health check
    In order to perform health check
    As a service
    I want to ensure downstream Micro Services are healthy

Scenario Outline: [uService] Status of downstream microservices are healthy
    Given health check micro service
    When health check is performed
    Then <downstreamservice> service returns correct description and status

Examples:
    | downstreamservice   |
    | Microservice one    |
    | Microservice two    |
    | Microservice three  |
    | Microservice four   |
    | Microservice five   |

Using strongly-typed classes makes your code more maintainable and less error-prone than using dynamic. Create these classes in your test project:

using System.Collections.Generic;

public class HealthCheckResponse
{
    public string Status { get; set; }
    public List<ServiceHealthResult> Results { get; set; }
}

public class ServiceHealthResult
{
    public string Name { get; set; }
    public string Status { get; set; }
    public string Description { get; set; }
}

Step 3: Implement the Then Step Binding

First, make sure your When step stores the raw JSON response in the ScenarioContext so the Then step can access it. Here's how the full binding class might look (including the When step for context):

using NUnit.Framework;
using System.Linq;
using TechTalk.SpecFlow;
using Newtonsoft.Json; // Or use System.Text.Json if you prefer .NET Core/.NET 5+

[Binding]
public class HealthCheckSteps
{
    private readonly ScenarioContext _scenarioContext;

    public HealthCheckSteps(ScenarioContext scenarioContext)
    {
        _scenarioContext = scenarioContext;
    }

    // Given step implementation (assuming you already have this set up)
    [Given(@"health check micro service")]
    public void GivenHealthCheckMicroService()
    {
        // Initialize your service client, set up auth, or any prerequisites here
    }

    // When step - fetch and store the health check JSON response
    [When(@"health check is performed")]
    public void WhenHealthCheckIsPerformed()
    {
        // Replace this with your actual WebService call logic to get the JSON response
        var rawJsonResponse = "{ \"status\": \"Healthy\", \"results\": [ { \"name\": \"Microservice one\", \"status\": \"Healthy\", \"description\": \"Url check MSOneURI success : status(OK)\" }, { \"name\": \"Microservice two\", \"status\": \"Healthy\", \"description\": \"Url check MSTwoURI success : status(OK)\" }, { \"name\": \"Microservice three\", \"status\": \"Healthy\", \"description\": \"Url check MSThreeURI success : status(OK)\" }, { \"name\": \"Microservice four\", \"status\": \"Healthy\", \"description\": \"Url check MSFourURI success : status(OK)\" }, { \"name\": \"Microservice five\", \"status\": \"Healthy\", \"description\": \"Url check MSFiveURI success : status(OK)\" } ] }";
        
        // Store the response in ScenarioContext to share with the Then step
        _scenarioContext.Set(rawJsonResponse, "HealthCheckResponse");
    }

    // The Then step you need to implement
    [Then(@"(.*) service returns correct description and status")]
    public void ThenServiceReturnsCorrectDescriptionAndStatus(string serviceName)
    {
        // Retrieve the stored JSON response
        var jsonResponse = _scenarioContext.Get<string>("HealthCheckResponse");
        
        // Deserialize JSON into our strongly-typed model
        var healthCheckData = JsonConvert.DeserializeObject<HealthCheckResponse>(jsonResponse);
        
        // Find the matching service in the results array
        var targetService = healthCheckData.Results
            .FirstOrDefault(s => s.Name.Equals(serviceName, StringComparison.OrdinalIgnoreCase));
        
        // Assert the service exists in the response
        Assert.IsNotNull(targetService, $"Service '{serviceName}' was not found in health check results");
        
        // Assert the service status is Healthy
        Assert.AreEqual("Healthy", targetService.Status, $"Service '{serviceName}' has unexpected status: {targetService.Status}");
        
        // Assert the description matches the expected pattern
        StringAssert.StartsWith($"Url check {serviceName.Replace(" ", "")}URI success : status(OK)", 
            targetService.Description, 
            $"Service '{serviceName}' has unexpected description: {targetService.Description}");
    }
}

Key Notes:

  • JSON Serialization: I used Newtonsoft.Json here, but if you're on .NET Core/.NET 5+, swap it out for System.Text.Json by replacing JsonConvert.DeserializeObject with JsonSerializer.Deserialize.
  • ScenarioContext: This is how we share data between steps—make sure you inject it into your binding class constructor.
  • Assertions: The description check uses a pattern match since each service's URI is unique (MSOneURI, MSTwoURI, etc.). Adjust this pattern if your actual description format differs.
  • Case Insensitivity: The service name comparison ignores case to avoid failures from minor case mismatches between the Feature file and JSON response.

内容的提问来源于stack exchange,提问作者Priyanka Ray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:30:06