我正在为 Razor 组件编写 BUnit 测试,该组件已注入如下依赖项:
@inject IMyFirstService FirstService
@inject IMySecondService SecondService
@code {
// do stuff
}
对于我的测试,我创建了一个后备服务提供程序MoqServiceProvider
,用于注册我的模拟依赖项。 但我也希望后备服务提供者Moq<MyType>
默认为我没有明确模拟的任何类型提供一个实例。
后备服务提供者如下所示
public class MockServiceProvider : IServiceProvider
{
private readonly Dictionary<Type, object> services = new();
public void RegisterServices(params object[] serviceInstances)
{
this.services.Clear();
foreach (object serviceInstance in serviceInstances)
{
if (serviceInstance is Mock)
{
this.services.Add(serviceInstance.GetType().GetGenericArguments().First(), (serviceInstance as Mock).Object);
}
else
{
this.services.Add(serviceInstance.GetType(), serviceInstance);
}
}
}
public object GetService(Type serviceType)
{
if (this.services.TryGetValue(serviceType, out object service))
{
return service;
}
else
{
// I want to return a Mock of serviceType here
// something like return new Mock<serviceType>(), but I don't know how to do that
}
}
}
我在测试中这样使用它(我使用 AutoFixture 来提供测试参数):
@inherits TestContext
@code{
[Theory, AutoDomainData]
public void TestSomething(
Mock<IMyFirstService> myFirstService,
MockServiceProvider serviceProvider)
{
serviceProvider.RegisterServices(myFirstService);
Services.AddFallbackServiceProvider(serviceProvider);
var component = Render(@<MyComponent />);
// do stuff to test
}
}
如果我运行它,我会得到一个错误Cannot provide a value for property 'SecondService' on type 'MyComponent'
,因为我还没有注册一个Mock<IMySecondService>
with的实例MockServiceProvider
。
我如何MockServiceProvider
返回我没有明确注册的每种类型的模拟(类似return Mock<serviceType
)?我的一些 Razor 组件有很多依赖项,我不想注入那些对每个测试都无关紧要的组件。