Specflow转换DataTable时提示'string'无UserCode定义如何解决
问题分析与解决方案
报错原因
- 直接原因:你在
table.CreateDynamicInstance()后调用了ToString(),将原本的动态对象直接转换成了字符串类型,字符串本身不存在UserCode属性,所以触发了该运行时错误。 - 前导0丢失的底层原因:Specflow的
CreateDynamicInstance/CreateInstance方法默认会自动推断单元格值的类型,形如0001的内容会被识别为int类型,自动转换为数值1,导致前导0丢失。
解决方案
以下是3种可行方案,按推荐优先级排序:
方案1:使用强类型类接收(最稳定推荐)
专门定义一个接收参数的实体类,指定属性为字符串类型,Specflow会自动按照属性类型做转换,不会丢失前导0:
- 定义实体类
public class UserParameter { public string UserCode { get; set; } }
- 修改步骤定义代码
[Then(@"I add a User Code")] public void ThenIAddAUserCode(Table table) { var data = table.CreateInstance<UserParameter>(); DocM.AddUserCode(data.UserCode); }
方案2:直接读取表格原始值(无需额外定义类)
直接从Table的行集合中取原始字符串内容,完全跳过类型自动推断逻辑,拿到的就是feature文件中写的原始值:
[Then(@"I add a User Code")] public void ThenIAddAUserCode(Table table) { // 取第一行的UserCode列原始值,Trim是为了去掉feature中单元格的多余空格 string userCode = table.Rows[0]["UserCode"].Trim(); DocM.AddUserCode(userCode); }
方案3:修改原有动态类型写法(仅适配不想改原有写法的场景)
去掉对整个动态对象的ToString()调用,单独对UserCode属性做字符串转换:
[Then(@"I add a User Code")] public void ThenIAddAUserCode(Table table) { dynamic data = table.CreateDynamicInstance(); // 单独将UserCode属性转成字符串,固定4位补前导0 string userCode = data.UserCode.ToString("D4"); DocM.AddUserCode(userCode); }
内容的提问来源于stack exchange,提问作者Tester
相关产品推荐
相关产品推荐

