将数据表转换为字符串 - 正在生成此错误 '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,我通常使用 RowDataTableRow 后缀。例如,如果数据 table 表示博客 post,我会将 DTO 命名为 BlogPostRowBlogPostDataTableRow.

您的步骤定义应更改为:

[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);
}