作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试为 IServiceProvider
创建一个 Mock(使用 Moq),以便我可以测试我的存储库类:
public class ApiResourceRepository : IApiResourceRepository
{
private readonly IServiceProvider _serviceProvider;
public ApiResourceRepository(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
_dbSettings = dbSettings;
}
public async Task<ApiResource> Get(int id)
{
ApiResource result;
using (var serviceScope = _serviceProvider.
GetRequiredService<IServiceScopeFactory>().CreateScope())
{
var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
result = await
context.ApiResources
.Include(x => x.Scopes)
.Include(x => x.UserClaims)
.FirstOrDefaultAsync(x => x.Id == id);
}
return result;
}
}
我创建 Mock 对象的尝试如下:
Mock<IServiceProvider> serviceProvider = new Mock<IServiceProvider>();
serviceProvider.Setup(x => x.GetRequiredService<ConfigurationDbContext>())
.Returns(new ConfigurationDbContext(Options, StoreOptions));
Mock<IServiceScope> serviceScope = new Mock<IServiceScope>();
serviceScope.Setup(x => x.ServiceProvider).Returns(serviceProvider.Object);
serviceProvider.Setup(x => x.CreateScope()).Returns(serviceScope.Object);
我收到以下错误:
System.NotSupportedException : Expression references a method that does not belong to the mocked object: x => x.GetRequiredService()
最佳答案
如前所述,Moq 不允许设置扩展方法。
但是在这种情况下,上述扩展方法的源代码可以在 Github 上找到
ServiceProviderServiceExtensions .
解决此类问题的通常方法是找出扩展方法的作用并通过其执行安全地模拟路径。
所有这些中的基本类型是 IServiceProvider
及其 object Getservice(Type type)
方法。此方法是解析服务类型时最终调用的方法。我们只处理抽象(接口(interface)),这使得最小起订量的使用变得更加容易。
//Arrange
var serviceProvider = new Mock<IServiceProvider>();
serviceProvider
.Setup(x => x.GetService(typeof(ConfigurationDbContext)))
.Returns(new ConfigurationDbContext(Options, StoreOptions));
var serviceScope = new Mock<IServiceScope>();
serviceScope.Setup(x => x.ServiceProvider).Returns(serviceProvider.Object);
var serviceScopeFactory = new Mock<IServiceScopeFactory>();
serviceScopeFactory
.Setup(x => x.CreateScope())
.Returns(serviceScope.Object);
serviceProvider
.Setup(x => x.GetService(typeof(IServiceScopeFactory)))
.Returns(serviceScopeFactory.Object);
var sut = new ApiResourceRepository(serviceProvider.Object);
//Act
var actual = sut.Get(myIntValue);
//Asssert
//...
查看上面的代码,您会看到这种安排如何满足扩展方法的预期行为以及扩展(无双关语意)被测方法。
关于c# - 最小起订量 IServiceProvider/IServiceScope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44336489/
我是一名优秀的程序员,十分优秀!