问题
I'm trying to create an automated test for some C# code using VB. Example: For the table Orchestra, i have 1 record for the organisation 1123, whereby user xxx has value for externalId = null and name is Charm White. So my test would be to check if expected externalId is null and the name is charm white for that user.
However, when declaring variables of value type string[] externalIds in VB code, it gives error :
value of type 'String' cannot be converted to 'string()'
Here's the C# code to be tested:
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();
}
Here's what I'm trying into 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
回答1:
Assuming that you are trying to pass 0001214 into the function under test and are expecting Charm White as the result then you need to create a string array with your 0001214 value - pass it to the function and test the result:
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))
Also, remove the line:
Dim names As String = String.Empty
As the value returned from the function under test is a string array not a string. I have also moved your declaration of organisationId so that it is close to the code that uses it.
来源:https://stackoverflow.com/questions/58888850/why-does-passing-variables-fails-with-error-value-type-string-cannot-be-conver