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

如何在C#中将Specflow ScenarioContext值传入API请求体?

解决Specflow ScenarioContext传值到API请求体的问题

你在使用.NET Core、Specflow、Selenium做API测试时,尝试通过ScenarioContext存储的值传入请求体,却收到'{salesOrderType}' cannot be found in the system错误。下面提供两种正确的实现方式:

方案1:优化字符串插值写法(修复原有逻辑)

原有手动拼接JSON的方式存在转义繁琐、易出错的问题,且未处理值的类型转换,可按以下方式修正:

// 先将ScenarioContext中的值转为字符串,同时处理空值情况
var salesOrderNumber = _scenarioContext["SalesOrderNumber"]?.ToString() ?? string.Empty;
var salesOrderType = _scenarioContext["SalesOrderType"]?.ToString() ?? string.Empty;

// 使用$@插值逐字字符串,简化JSON拼接(双大括号{{}}用于转义JSON的大括号)
var body = $@"{{
    ""entity"": {{
        ""OrderType"": {{
            ""value"": ""{salesOrderType}""
        }},
        ""OrderNbr"": {{
            ""value"": ""{salesOrderNumber}""
        }}
    }}
}}";

方案2:使用实体类序列化(推荐)

手动拼接JSON容易出现语法错误,推荐定义对应实体类后通过序列化生成请求体,类型更安全:

1. 定义请求体实体类

public class OrderRequest
{
    public Entity entity { get; set; }
}

public class Entity
{
    public OrderField OrderType { get; set; }
    public OrderField OrderNbr { get; set; }
}

public class OrderField
{
    public string value { get; set; }
}

2. 生成请求体

// 安全从ScenarioContext取值,避免键不存在的异常
if (!_scenarioContext.TryGetValue("SalesOrderType", out var salesOrderTypeObj))
{
    throw new InvalidOperationException("SalesOrderType未在ScenarioContext中存储");
}
if (!_scenarioContext.TryGetValue("SalesOrderNumber", out var salesOrderNumberObj))
{
    throw new InvalidOperationException("SalesOrderNumber未在ScenarioContext中存储");
}

var salesOrderType = salesOrderTypeObj?.ToString() ?? string.Empty;
var salesOrderNumber = salesOrderNumberObj?.ToString() ?? string.Empty;

// 构建实体对象
var requestBody = new OrderRequest
{
    entity = new Entity
    {
        OrderType = new OrderField { value = salesOrderType },
        OrderNbr = new OrderField { value = salesOrderNumber }
    }
};

// 使用.NET Core内置的System.Text.Json序列化
var body = System.Text.Json.JsonSerializer.Serialize(requestBody, new System.Text.Json.JsonSerializerOptions
{
    WriteIndented = true // 格式化输出JSON,方便调试
});

额外检查点

  • 确认ScenarioContext中确实已存入SalesOrderType和SalesOrderNumber,键名拼写、大小写完全匹配;
  • 若使用方案1,确保字符串插值的语法正确($@组合使用时,JSON的大括号需用{{}}转义)。

内容的提问来源于stack exchange,提问作者Shari Valenta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:31:11