gpt4 book ai didi

c# - 最小起订量 IServiceProvider/IServiceScope

转载 作者:可可西里 更新时间:2023-11-01 03:14:27 26 4
gpt4 key购买 nike

我正在尝试为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com