.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
相关产品推荐
相关产品推荐

