В этом сценарии это, вероятно, не помогает создавать макеты, которые возвращают больше макетов.Ваш класс зависит от IServiceProvider
, и вам нужно позвонить CreateScope()
.
Mocking IServiceProvider
для возврата другого макета функционально аналогичен использованию real ServiceProvider
и настройке его для возврата макета.Разница в том, что если вы используете реальный ServiceProvider
, вам также не придется издеваться над CreateScope
.
(я полностью обхожу вопросы о том, где и когда зависеть от IServiceProvider.
)
Вот резко упрощенный пример:
Класс, который зависит от IServiceProvider
:
public class ScopedFooFactory : IFooFactory
{
private readonly IServiceProvider _serviceProvider;
public ScopedFooFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public IFoo CreateFoo()
{
using (var scope = _serviceProvider.CreateScope())
{
return scope.ServiceProvider.GetService<IFoo>();
}
}
}
... и некоторый код модульного теста:
var serviceCollection = new ServiceCollection();
var fooMock = new Mock<IFoo>();
serviceCollection.AddScoped<IFoo>(provider => fooMock.Object);
var serviceProvider = serviceCollection.BuildServiceProvider();
var subject = new ScopedFooFactory(serviceProvider);
var foo = subject.CreateFoo();
Assert.AreSame(fooMock.Object, foo);
Для меня это проще и проще, чем создавать макет, который возвращает больше насмешек.