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

Nunit测试gRPC服务时ServerCallContext的RequestHeader为空如何处理?

解决gRPC测试中Mock ServerCallContext请求头为空的问题

核心问题是你需要给Mock的ServerCallContext对象手动设置RequestHeaders属性,默认Mock实例的这个属性是空集合。以下是具体实现参考:

步骤说明

  1. 构造gRPC的Metadata对象,添加包含用户名的键值对;
  2. 配置Mock的ServerCallContext,让它的RequestHeaders返回这个构造好的Metadata;
  3. 用这个Mock上下文调用服务方法,验证逻辑是否正确获取用户名。

完整测试用例示例(基于Moq + NUnit)

using Grpc.Core;
using Moq;
using NUnit.Framework;

[TestFixture]
public class YourGrpcServiceTests
{
    [Test]
    public void Service_Should_GetUsername_From_RequestHeaders()
    {
        // 1. 构建带用户名的请求头
        var testHeaders = new Metadata
        {
            { "username", "test_user_123" }
            // 如果你的服务用的是带前缀的Header,比如x-username,就改成对应的键
        };

        // 2. Mock ServerCallContext并设置RequestHeaders
        var mockContext = new Mock<ServerCallContext>();
        mockContext.Setup(ctx => ctx.RequestHeaders).Returns(testHeaders);

        // 3. 实例化你的gRPC服务
        var targetService = new YourGrpcService();

        // 4. 调用服务方法(这里假设你的方法是GetProfile,传入对应请求对象)
        var request = new GetProfileRequest();
        var response = targetService.GetProfile(request, mockContext.Object);

        // 5. 断言服务正确获取并使用了用户名
        Assert.Multiple(() =>
        {
            Assert.That(response.Username, Is.Not.Null);
            Assert.That(response.Username, Is.EqualTo("test_user_123"));
        });
    }
}

服务端对应逻辑参考

确保你的gRPC服务代码正确从上下文获取Header值:

public override Task<GetProfileResponse> GetProfile(GetProfileRequest request, ServerCallContext context)
{
    // 从RequestHeaders中获取用户名
    var usernameHeader = context.RequestHeaders.FirstOrDefault(h => h.Key.Equals("username", StringComparison.OrdinalIgnoreCase));
    var username = usernameHeader?.Value ?? "default_user";

    return Task.FromResult(new GetProfileResponse { Username = username });
}

其他Mock框架适配(比如NSubstitute)

如果用NSubstitute代替Moq,设置RequestHeaders的写法更简洁:

var mockContext = Substitute.For<ServerCallContext>();
mockContext.RequestHeaders.Returns(testHeaders);

内容的提问来源于stack exchange,提问作者user768853

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:05:15