首页 > 解决方案 > 为什么传递变量失败,错误值类型“字符串”无法转换为“字符串()”?

问题描述

我正在尝试使用 VB 为一些 C# 代码创建一个自动化测试。示例:对于表 Orchestra,我有 1 条组织 1123 的记录,其中用户 xxx 的值为 externalId = null,名称为 Charm White。所以我的测试是检查预期的 externalId 是否为空,并且该用户的名称是否为魅力白色。

但是,在 VB 代码中声明值类型 string[] externalIds 的变量时,会出现错误:

'String' 类型的值不能转换为 'string()'

这是要测试的 C# 代码:

  public string[] GetNamesFromExternalIds(string organisationId, string[] externalIds)
    {
        string externalIdsString = null;
        foreach (string externalId in externalIds)
        {
            if (externalIdsString != null)
            {
                externalIdsString += ",";
            }
            externalIdsString += "'" + externalId + "'";
        }

        DbParameterCollection parameters = new DbParameterCollection();
        parameters.Add(new DbParameter("@OrganisationId",SqlDbType.NVarChar, 
        organisationId));

        string sql = string.Format(@"SELECT ExternalId, Name FROM Orchestra 
        WHERE ExternalId IN ({0}) AND OrganisationId = @OrganisationId",
        externalIdsString);

        ListObject list = new ListObject(_Accessor);
        list.Read(sql, parameters);

        List<string> names = new List<string>();
        foreach (string externalId in externalIds)
        {
            foreach (DataRow dataRow in list.Table.Rows)
            {
                if (dataRow["ExternalId"].ToString() == externalId)
                {
                    names.Add(dataRow["Name"].ToString());
                    break;
                }
            }
            names.Add(null);
        }

        return names.ToArray();
    }

这是我正在尝试进入 VB 的内容:

<TestClass()> Public Class UT_GetNamesFromExternalIds
    <TestMethod()> Public Sub GetNamesFromExternalIds()

        Dim organisationId As String = "1123"

        Dim externalIds() As String ={0}
        Dim user as string = "XXX"
        Dim names As String = String.Empty

        Dim ExpNames As String = "Charm White"
        Dim ExpexternalIds As String = Nothing

        Dim DataServer As New DataServer()
        Dim Accessor = DataServer.GetAccessor()
        Dim _StandardHeader = New StandardHeader
        Dim _AuditProvider = New Audit.AuditProvider(_StandardHeader)
        Dim AD As New Ceridian.Administration.Authentication.AuthenticationData(Accessor, _AuditProvider)

        externalIds = AD.GetNamesFromExternalIds(organisationId, 
         externalIds)

        Assert.AreEqual(1, externalIds.Count)
        Assert.AreEqual(ExpexternalIds, externalIds(0))


        Assert.AreEqual(ExpNames, names)

        Console.WriteLine(ExpNames)
        Console.WriteLine(names)

        Console.WriteLine(ExpexternalIds)
        Console.WriteLine(externalIds)
    End Sub

End Class

标签: c#vb.netmstest

解决方案


假设您正在尝试传递0001214到被测函数并期望Charm White得到结果,那么您需要使用您的0001214值创建一个字符串数组 - 将其传递给函数并测试结果:

Dim externalIds As String() = {"0001214"}
Dim organisationId As String = "1123"
Dim names = AD.GetNamesFromExternalIds(organisationId, externalIds)

Dim ExpNames As String = "Charm White"

Assert.AreEqual(1, names.Count)
Assert.AreEqual(ExpNames, names(0))

另外,删除该行:

Dim names As String = String.Empty

由于从被测函数返回的值是字符串数组而不是字符串。我还移动了您的声明,organisationId以便它接近使用它的代码。


推荐阅读