如何模拟通过 lambda 表达式作为输入提供给匿名 Func 委托的参数?

How to mock parameter provided as input to anonymous Func delegate via lambda expression?

我有这段代码,我正在尝试为其编写单元测试:

public static void AddRuntimeServices(this IServiceCollection services)
{
    services.AddScoped<IAppClient>((serviceProvider) =>
    {
        var snapshotService = serviceProvider.GetRequiredService<ISnapshotService>();
        var urlContext = serviceProvider.GetRequiredService<IUrlContext>();

        return new AppClient(
            serviceUrl: urlContext.restApiUrl,
            httpClient: snapshotService.Client);
    });
}

在这段代码中,我可以模拟给这个方法的 services 输入,但是我如何模拟 serviceProvider 变量(来自给定的 services 输入这个方法),它作为一个输入给一个内联写入的匿名 Func 委托?

我希望能够模拟 serviceProvider,这样我就可以写这样的东西:

serviceProvider.GetRequiredService<ISnapshotService>().Returns(somethingToReturn);

我正在使用 MSTest (Microsoft.VisualStudio.TestTools.UnitTesting) 编写我的单元测试。

使用实际的服务集合。并添加模拟服务,以便在解决它们时您可以控制所需的行为

//...

//Arrange

IServiceCollection services = new ServiceCollection();

ISnapshotService snapshotService = Mock.Of<ISnapshotService>();
IUrlContext urlContext = Mock.Of<IUrlContext>();

services.AddScoped<ISnapshotService>(sp => snapshotService);
services.AddScoped<IUrlContext>(sp => urlContext);

//Act
services.AddRuntimeServices();

IServiceProvider serviceProvider = services.BuildServiceProvider();
IAppClient client = serviceProvider.GetRequiredService<IAppClient>();

//Assert
//...assert expected behavior

//...