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

.NET 7使用NSubstitute模拟Dapr Client遇NS1000错误求助

解决Dapr Client单元测试中InvokeMethodAsync无法被拦截的问题

问题原因

你遇到的NS1000错误,核心是DaprClient类的InvokeMethodAsync是非虚方法,而NSubstitute只能拦截接口成员、虚方法、抽象方法或重写方法,直接模拟DaprClient实例自然会失败。

解决方案

1. 服务代码改用IDaprClient接口依赖

把服务类中_daprClient的类型从DaprClient改为IDaprClient,通过接口注入依赖:

// 服务类的字段和构造函数
private readonly IDaprClient _daprClient;

public YourService(IDaprClient daprClient)
{
    _daprClient = daprClient;
}

// 原GetTransactionDetails方法无需修改
public async Task<TransactionResponse> GetTransactionDetails(Transaction transaction){
    var response = await _daprClient.InvokeMethodAsync<TransactionResponse>(HttpMethod.Get, "svc-transactions", transaction.id);
    return response;
}

2. 测试代码模拟IDaprClient接口

在测试中创建IDaprClient的替代实例,而非直接模拟DaprClient类:

// 初始化IDaprClient的替代对象
var _daprClient = Substitute.For<IDaprClient>();

// 设置预期返回值
_daprClient
    .InvokeMethodAsync<TransactionResponse>(HttpMethod.Get, "svc-transactions", "123")
    .Returns(transactionResponse);

原理说明

Dapr官方提供了IDaprClient接口,封装了所有客户端操作方法。NSubstitute可以完美模拟接口的抽象方法,完全满足拦截要求。而Dapr的DI扩展(AddDapr)已经默认注册了IDaprClient的实现,所以服务端无需额外修改注册逻辑,只需切换依赖类型即可。

内容的提问来源于stack exchange,提问作者Shivam Kumar Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:45:03