如何在NSubstitute中为任意字符串键的索引器模拟返回值?
如何在NSubstitute中模拟只读索引器的任意键返回值?
场景背景
先定义一个包含只读索引器的接口:
public interface ISomeInterface { string this[string key] { get; } }
在Moq中,我们可以为任意字符串类型的索引键设置统一返回值:
Mock<ISomeInterface> mock = new(); mock .Setup(m => m[It.IsAny<string>()]) .Returns("anything for all string key");
此前误以为NSubstitute无法实现同类操作,实际是可行的,以下是具体实现方法。
NSubstitute的实现方式
基础场景(返回字符串)
直接使用Arg.Any<string>()匹配任意索引键,再通过Returns指定返回值:
ISomeInterface mock = Substitute.For<ISomeInterface>(); mock[Arg.Any<string>()].Returns("anything for all string key");
实际业务场景(返回自定义类型)
如果接口索引器返回自定义类型(例如LocalizedString),且启用了严格表达式检查,可以通过Returns的回调参数获取调用时的索引键,再构造对应的返回对象:
接口定义:
public interface ISomeInterface { LocalizedString this[string key] { get; } }
模拟代码:
ISomeInterface<LocalizatorType> mock = Substitute.For<ISomeInterface<LocalizatorType>>(); _ = mock[Arg.Any<string>()].Returns(argsFromCall => new LocalizedString(argsFromCall.ArgAt<string>(0), "en"));
注:此前的误解源于实际场景中返回类型为自定义类型且启用了严格检查,错误提示不够清晰,并非NSubstitute不支持该功能。
内容的提问来源于stack exchange,提问作者Tomcat
相关产品推荐
相关产品推荐

