C# 单元测试错误System.InvalidCastException:

C# 单元测试错误System.InvalidCastException:,c#,unit-testing,asp.net-core,C#,Unit Testing,Asp.net Core,我正在测试一个方法,该方法从我的存储库调用函数并将其作为列表返回,但我一直遇到以下错误: System.InvalidCastException:无法将类型为“System.Collections.Generic.List`1[System.String]”的对象强制转换为类型为“System.String[]” 我不知道我错过了什么。方法如下: public IList<TransactionStatus> GetBookingStatuses(IList<string>

我正在测试一个方法,该方法从我的存储库调用函数并将其作为列表返回,但我一直遇到以下错误:

System.InvalidCastException:无法将类型为“System.Collections.Generic.List`1[System.String]”的对象强制转换为类型为“System.String[]”

我不知道我错过了什么。方法如下:

public IList<TransactionStatus> GetBookingStatuses(IList<string> uniqueTransactionRefs)
{
    TransactionStatus[] transactionStatuses = DBRepository.GetStatuses((string[])uniqueTransactionRefs);
    return transactionStatuses;
}
IList
是一个由字符串数组(
string[]
)和字符串列表(
List
)实现的接口。这意味着无论使用哪种底层数据类型,都可以接收多个字符串

在您的情况下,您的方法
GetBookingStatuses
IList
的形式接收数据,但是从错误消息中可以看到,
uniqueTransactionRefs
的实际类型是
System.Collections.Generic.List`1[System.String]
,即
List
。由于这是一个有效的
IList
,因此将数据传递给该方法可以正常工作。但是,当您尝试将其强制转换为字符串数组时,它将失败,因为
列表
string[]
不直接兼容

修复此问题有两个选项:

  • 您可以通过调用
    .ToArray()
    列表显式转换为字符串数组。这将使用源列表中的元素创建一个新的字符串数组:

    TransactionStatus[] transactionStatuses = DBRepository.GetStatuses(uniqueTransactionRefs.ToArray());
    
  • 根据
    GetStatuses
    方法的功能,您还可以更改其签名,使其不需要字符串数组,但也可以使用
    IList
    。然后您可以从
    GetBookingStatus
    直接传入
    uniqueTransactionRefs
    ,而无需转换:

    TransactionStatus[] transactionStatuses = DBRepository.GetStatuses(uniqueTransactionRefs);
    
    public TransactionStatus[]获取状态(IList uniqueTransactionRefs)
    {
    // …
    }
    

嗯,有趣的是,我原以为
列表上的
ToArray()
会被优化为只返回底层数组,而不是复制它,但源代码说您right@CamiloTerevintoAfaik,
ToArray()
将始终创建一个新数组,以便您可以使用它快速获取无法由原始源变异的数组的安全副本。我认为您需要将uniqueTransactionRefs传递给GetStatuses方法。
TransactionStatus[] transactionStatuses = DBRepository.GetStatuses(uniqueTransactionRefs);
public TransactionStatus[] GetStatuses(IList<string> uniqueTransactionRefs)
{
    // …
}