使用gRPC对象时MS Test的DynamicData无法正确填充测试数据
使用gRPC对象时MS Test的DynamicData无法正确填充测试数据
我目前在使用Visual Studio 2022 + MS Test做测试,同时用Grpc.Tools(2.69.0)和Google.Protobuf(3.29.3)这两个NuGet包从Proto文件生成代码。最近遇到了MS Test的DynamicData特性的奇怪问题——虽然我不清楚它的底层实现,但发现用Protobuf编译器生成的类时,测试数据里的对象属性无法正确填充。
问题场景分两种情况:
Case1:Protobuf自动生成类
当Step、Element1、Element2这几个类是通过Protobuf编译器自动生成的时候,运行TestMethod时,传入的step对象里的Elements属性是null(如图所示)。
Case2:手动编写类
如果我完全手动创建Step、Element1、Element2这几个类,不依赖Protobuf生成,那么step对象的Elements属性就不会是null,能正常拿到数据。

我的代码示例
MS Test测试代码
namespace TestProject { [TestClass] public class UnitTest { [TestMethod] [DynamicData(nameof(GetTestData), typeof(UnitTest), DynamicDataSourceType.Method)] public void TestMethod(Step step) { } public static IEnumerable<object[]> GetTestData() { yield return new object[] { Step_Element1() }; yield return new object[] { Step_Element2() }; } private static Step Step_Element1() { var step = new Step(); step.Elements.Add(new Element { Element1 = new Element1() }); return step; } private static Step Step_Element2() { var step = new Step(); step.Elements.Add(new Element { Element2 = new Element2() }); return step; } } }
对应的Proto文件(command.proto)
syntax = "proto3"; message Step { repeated Element elements = 1; } message Element1 { } message Element2 { } message Element { oneof value { Element1 element1 = 1; Element2 element2 = 2; } }
备注:内容来源于stack exchange,提问作者theateist
相关产品推荐
相关产品推荐

