私は私のリポジトリクラスをテストできるようにIServiceProvider
用(部品番号を使用して)モックを作成しようとしています:以下のように部品番号IServiceProvider/IServiceScope
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<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できません。 – PmanAce
はい、私は見ましたが、それは拡張メソッドのようです。私はIServiceProviderに依存しているので、このクラスをどのようにテストすることができるか見て苦労しています。 – blgrnboy
可能な解決策については、この回答を確認してください。 [Moqを使った拡張メソッドのモック](https://stackoverflow.com/questions/2295960/mocking-extension-methods-with-moq) – PmanAce