You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 03:18:03