我正在尝试使用 ValueTuples (当前的 NuGet 包),虽然我需要它的大多数东西都是无缝的,但在尝试对与继承相关的某些场景进行单元测试时出现了问题。我做了一个简单的接口/实现测试,任何人都可以重复,这对于虚拟/覆盖示例也失败了。
首先创建一个简单的控制台项目和一个简单的单元测试并将两者链接起来。然后为主项目创建一个 Fakes (Microsoft.QualityToole.Testing.Fakes) 对象。创建以下类。
public interface IModelClass
{
(string val1, int val2) Run();
}
public class ModelClass : IModelClass
{
public (string val1, int val2) Run()
{
throw new NotImplementedException();
}
}
这可以在不需要实现接口的情况下得到证明,因为在构建假货时,接口本身无法编译。
构建解决方案会产生此错误:
- 严重性:错误
- 代码:CS8141
- 说明:方法“StubIModelClass.IModelClass.Run()”签名中的元组元素名称必须与接口方法“IModelClass.Run()”的元组元素名称匹配(包括返回类型)。
该错误源于 fakes 构建目录中的 f.cs 文件,因为它将 Run() 方法存根实现为:
svt::System.ValueTuple<string, int> vt::ValueTuple.IModelClass.Run()
返回签名与接口上命名的 ValueTuple 的签名不匹配。如果我们删除命名并在所有构建的所有地方都使用 (string, int),但是您会受到简单元组和 Item1、Item2 的限制……这似乎违背了 ValueTuple 的目的。
经过大量搜索后,我最终来到这里,询问是否有人能够通过在 UnitTests 上工作的 ValueTuple 获得继承,如果没有,您除了求助于什么解决方案
- 删除单元测试
- 将 TupleValue 转换为类
- 使用简单的元组
如果可能的话,我想避免这些。