C# 为什么传递变量失败,错误值类型“string”无法转换为“string()”?

C# 为什么传递变量失败,错误值类型“string”无法转换为“string()”?,c#,vb.net,mstest,C#,Vb.net,Mstest,我正在尝试使用VB为一些C代码创建一个自动测试。 示例:对于table Orchestration,我有一条组织1123的记录,其中用户xxx的externalId值为null,name为Charm White。因此,我的测试将是检查预期的externalId是否为null,并且该用户的名称是否为charm white 但是,在VB代码中声明值类型为string[]ExternalId的变量时,会出现以下错误: 无法将“String”类型的值转换为“String” 下面是要测试的C代码: p

我正在尝试使用VB为一些C代码创建一个自动测试。
示例:对于table Orchestration,我有一条组织1123的记录,其中用户xxx的externalId值为null,name为Charm White。因此,我的测试将是检查预期的externalId是否为null,并且该用户的名称是否为charm white

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

无法将“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

假设您正试图将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

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

names变量正在测试中,但从未设置为空字符串以外的任何值。代码中的哪一行出现错误?您从未向我们显示将要作为第二个参数传递的变量声明在何处:Dim EXTERNAMIDS=AD.GetNamesFromExternalidsOrganizationId,EXTERNATIDS。它可能被声明为类型字符串而不是类型字符串。使用相同的变量名来分配结果是一个坏主意。0001214值是否是您要发送给被测函数的值,并且是否是您期望返回的结果?@chetan这一行在ExternalId上给出了错误:Dim ExternalId=AD.GetNamesFromExternalidsOrganizationId,externalId对于table Orchestration,我有一条组织1123的记录,其中用户xxx的externalId值为null,名称为Charm White。所以我的测试是检查用户预期的externalId是否为null,name是否为charm white。我想我也会将它传递给该用户,对吗?我认为您正在测试的函数永远不会找到外部ID为Null的记录,因为它正在使用SQL IN来获取适当的记录。这是需要进行的特定测试吗?您可以将测试数据中的null值更改为您可以测试的值吗?是的,我可以尝试使用useridOK-为了测试您尝试测试的函数,您需要在测试数据中使用一个不为null的externalId记录。然后可以将该外部ID传递给函数,并确保返回正确的名称。并且返回的数组只有一个值