多次执行同一SpecFlow步骤时,如何用ScenarioContext存储多记录ID?
解决SpecFlow场景中存储多个Record ID的问题
你的问题核心在于每次执行创建记录的步骤时,都用单个值覆盖了ScenarioContext里的Record Ref,导致最后只能保留最后一条记录的ID。要在同一场景内收集所有生成的记录ID,我们只需要把存储的对象从单个字符串改成列表即可,具体实现如下:
1. 修改Given步骤定义,存储记录ID到列表
我们需要先检查ScenarioContext中是否已经存在存储记录ID的列表,如果没有就初始化一个,然后每次生成新的recordRef时添加到列表里:
[Given(@"""(.*)"" is created a record")] public void GivenIsCreatedARecord(string username) { // 生成唯一recordRef的逻辑 var recordRef = <<some Logic>>; // 检查ScenarioContext中是否已有RecordRefs列表,没有则初始化 if (!ScenarioContext.Current.ContainsKey("RecordRefs")) { ScenarioContext.Current["RecordRefs"] = new List<string>(); } // 将新生成的recordRef添加到列表中 var recordRefList = (List<string>)ScenarioContext.Current["RecordRefs"]; recordRefList.Add(recordRef); }
2. 编写Then步骤,获取所有记录ID进行校验
接下来在验证步骤中,我们可以从ScenarioContext取出这个列表,然后完成所有ID的校验逻辑:
[Then(@"admin is able to check all the record IDs")] public void ThenAdminIsAbleToCheckAllTheRecordIDs() { // 取出存储的所有recordRef列表 var recordRefList = (List<string>)ScenarioContext.Current["RecordRefs"]; // 这里编写你的校验逻辑,比如检查列表数量是否符合预期、每个ID是否有效等 // 示例:验证列表长度等于场景中创建记录的次数 Assert.IsTrue(recordRefList.Count > 0, "没有生成任何记录ID"); // 遍历列表验证每个ID的有效性 foreach (var refId in recordRefList) { Assert.IsFalse(string.IsNullOrEmpty(refId), $"记录ID {refId} 无效"); // 其他自定义校验逻辑... } }
3. 原Feature文件无需修改
你的两个Feature场景可以保持原样,因为步骤定义已经适配了多记录的情况:
Feature 1: 不同用户创建记录
Scenario: Record Creation for different Users Given "User 1" is created a record And "User 2" is created a record And "User 3" is created a record Then admin is able to check all the record IDs
Feature 2: 访客用户创建记录
Scenario: Record Creation for guest User Given "guest User 1" is created a record Then admin is able to check all the record IDs
额外提示
- 如果需要关联用户名和对应的recordRef,也可以把存储对象改成
Dictionary<string, string>,键是用户名,值是对应的recordRef,这样后续校验时可以精准定位到每个用户的记录。 - 注意在场景执行完毕后,
ScenarioContext会自动清空,所以不用担心不同场景之间的数据干扰。
内容的提问来源于stack exchange,提问作者Subburaj
相关产品推荐
相关产品推荐

