C# 单元测试错误System.InvalidCastException:
我正在测试一个方法,该方法从我的存储库调用函数并将其作为列表返回,但我一直遇到以下错误: System.InvalidCastException:无法将类型为“System.Collections.Generic.List`1[System.String]”的对象强制转换为类型为“System.String[]” 我不知道我错过了什么。方法如下: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>
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)
{
// …
}