将数据表转换为字符串 - 正在生成此错误 'string' 不包含 'UserCode' 的定义
Convert datatable into string - this error is being generated 'string' does not contain a definition for 'UserCode'
我有一个带有数据表的特征文件。当值 UserCode ='0001' 被传递时,它会将其转换为 '1'。因此,我将 .ToString() 方法添加到以下行:dynamic data = table.CreateDynamicInstance().ToString();
现在我收到以下错误:
'string' does not contain a definition for 'UserCode'
专题文件
And I add a user Code
| UserCode|
| 0001 |
步骤定义
[Then(@"I add a User Code")]
public void ThenIAddAUserCode(Table table)
{
dynamic data = table.CreateDynamicInstance().ToString();
// string str = Convert.ToString(data);
// DocM.AddUserCode((string)data.UserCode);
DocM.AddUserCode(data.UserCode);
}
页面方法
public void AddUserCode(string usercode)
{
IJavaScriptExecutor je = (IJavaScriptExecutor)driver;
//find the invisible element on the list by xpath/tag etc.
var path = By.XPath("//table[@id='DocMP']/tbody/tr[1]//td[1]//input[@value='" + usercode+ "']");
var Userpath = driver.FindElement(path);
MyFunc.WaitFor(driver, path);
//use javascript to navigate to that element
je.ExecuteScript("arguments[0].scrollIntoView(false);", Userpath);
MyFunc.HighlightElement(driver, Userpath);
if (Userpath.Displayed)
{
Userpath.Click();
btnApply.Click();
}
}
有人可以帮忙解决这个问题吗?我是 c# 和 specflow 的新手。
SpecFlow 在将数据 tables 转换为 C# 中的 dynamic
时会尽力猜测数据类型。在这种情况下,SpecFlow 似乎猜测仅包含数字的字符串很可能是 int
,当然会从 0001
中去除前导零。相反,考虑创建一个数据传输对象来表示数据 table:
中的数据
public class X
{
public string UserCode { get; set; }
}
并更改您的步骤定义以创建此 class 的新实例(参见 Table.CreateInstance() method)。我没有看到足够多的场景来建议名称,因此请将 public class X
替换为对您的用例有意义的名称。对于从 SpecFlow 中的数据 table 映射的 classes,我通常使用 Row
或 DataTableRow
后缀。例如,如果数据 table 表示博客 post,我会将 DTO 命名为 BlogPostRow
或 BlogPostDataTableRow
.
您的步骤定义应更改为:
[Then(@"I add a User Code")]
public void ThenIAddAUserCode(Table table)
{
X data = table.CreateInstance<X>();
DocM.AddUserCode(data.UserCode);
}
如果您只需要在该步骤中传递用户代码,我建议您改用带引号的值:
And I add a user Code "0001"
如果您自动生成该步骤,SpecFlow 仍会猜测 0001
是一个 int
,因此以下步骤定义应该有效:
[Then(@"I add a User Code ""(.*)""")]
public void ThenIAddAUserCode(string userCode)
{
DocM.AddUserCode(userCode);
}
我有一个带有数据表的特征文件。当值 UserCode ='0001' 被传递时,它会将其转换为 '1'。因此,我将 .ToString() 方法添加到以下行:dynamic data = table.CreateDynamicInstance().ToString();
现在我收到以下错误:
'string' does not contain a definition for 'UserCode'
专题文件
And I add a user Code
| UserCode|
| 0001 |
步骤定义
[Then(@"I add a User Code")]
public void ThenIAddAUserCode(Table table)
{
dynamic data = table.CreateDynamicInstance().ToString();
// string str = Convert.ToString(data);
// DocM.AddUserCode((string)data.UserCode);
DocM.AddUserCode(data.UserCode);
}
页面方法
public void AddUserCode(string usercode)
{
IJavaScriptExecutor je = (IJavaScriptExecutor)driver;
//find the invisible element on the list by xpath/tag etc.
var path = By.XPath("//table[@id='DocMP']/tbody/tr[1]//td[1]//input[@value='" + usercode+ "']");
var Userpath = driver.FindElement(path);
MyFunc.WaitFor(driver, path);
//use javascript to navigate to that element
je.ExecuteScript("arguments[0].scrollIntoView(false);", Userpath);
MyFunc.HighlightElement(driver, Userpath);
if (Userpath.Displayed)
{
Userpath.Click();
btnApply.Click();
}
}
有人可以帮忙解决这个问题吗?我是 c# 和 specflow 的新手。
SpecFlow 在将数据 tables 转换为 C# 中的 dynamic
时会尽力猜测数据类型。在这种情况下,SpecFlow 似乎猜测仅包含数字的字符串很可能是 int
,当然会从 0001
中去除前导零。相反,考虑创建一个数据传输对象来表示数据 table:
public class X
{
public string UserCode { get; set; }
}
并更改您的步骤定义以创建此 class 的新实例(参见 Table.CreateInstance() method)。我没有看到足够多的场景来建议名称,因此请将 public class X
替换为对您的用例有意义的名称。对于从 SpecFlow 中的数据 table 映射的 classes,我通常使用 Row
或 DataTableRow
后缀。例如,如果数据 table 表示博客 post,我会将 DTO 命名为 BlogPostRow
或 BlogPostDataTableRow
.
您的步骤定义应更改为:
[Then(@"I add a User Code")]
public void ThenIAddAUserCode(Table table)
{
X data = table.CreateInstance<X>();
DocM.AddUserCode(data.UserCode);
}
如果您只需要在该步骤中传递用户代码,我建议您改用带引号的值:
And I add a user Code "0001"
如果您自动生成该步骤,SpecFlow 仍会猜测 0001
是一个 int
,因此以下步骤定义应该有效:
[Then(@"I add a User Code ""(.*)""")]
public void ThenIAddAUserCode(string userCode)
{
DocM.AddUserCode(userCode);
}