企业做网站收费,重庆建筑网络平台,网站建设见站分析和准备论文,亚马逊雨林探险之旅作文问题由于依赖注入#xff0c;特别是构造函数注入的广泛使用#xff0c;使得编写单元测试时#xff0c;需要使用Mock框架#xff08;例如Moq#xff09;生成测试类的依赖接口的模拟实现#xff0c;并验证接口是否按预期使用。例如eShopOnContainers中的测试代… 问题由于依赖注入特别是构造函数注入的广泛使用使得编写单元测试时需要使用Mock框架例如Moq生成测试类的依赖接口的模拟实现并验证接口是否按预期使用。例如eShopOnContainers中的测试代码就使用了Moq实现如下private readonly MockIMediator _mediatorMock;
private readonly MockIOrderQueries _orderQueriesMock;
private readonly MockIIdentityService _identityServiceMock;
private readonly MockILoggerOrdersController _loggerMock;public OrdersWebApiTest()
{_mediatorMock new MockIMediator();_orderQueriesMock new MockIOrderQueries();_identityServiceMock new MockIIdentityService();_loggerMock new MockILoggerOrdersController();
}[Fact]
public async Task Cancel_order_with_requestId_success()
{//Arrange_mediatorMock.Setup(x x.Send(It.IsAnyIdentifiedCommandCancelOrderCommand, bool(), default(CancellationToken))).Returns(Task.FromResult(true));//Actvar orderController new OrdersController(_mediatorMock.Object, _orderQueriesMock.Object, _identityServiceMock.Object, _loggerMock.Object);var actionResult await orderController.CancelOrderAsync(new CancelOrderCommand(1), Guid.NewGuid().ToString()) as OkResult;//AssertAssert.Equal(actionResult.StatusCode, (int)System.Net.HttpStatusCode.OK);}
可以看到OrdersController依赖了4个接口而每个测试用例都必须将Mock对象传入构造函数一旦更改了OrdersController的构造函数参数那么你将需要更改大量单元测试代码。如何简化这部分工作Moq.AutoMockerMoq.AutoMocker是一款基于Moq的IoC容器它可以用来自动创建待测试类的依赖。引用nuget包Moq.AutoMock之后上面的测试代码可以修改如下[Fact]
public async Task Cancel_order_with_requestId_success()
{//Arrangevar autoMocker new AutoMocker();var orderController autoMocker.CreateInstanceOrdersController();var mediatorMock autoMocker.GetMockIMediator();mediatorMock.Setup(x x.Send(It.IsAnyIdentifiedCommandCancelOrderCommand, bool(), default(CancellationToken))).Returns(Task.FromResult(true));//Actvar actionResult await orderController.CancelOrderAsync(new CancelOrderCommand(1), Guid.NewGuid().ToString()) as OkResult;//AssertAssert.Equal(actionResult.StatusCode, (int)System.Net.HttpStatusCode.OK);
}
可以看到无需提前生成Mock对象autoMocker.CreateInstanceT即可创建指定类型的实例。autoMocker.GetMockT可以获得依赖接口的Mock实例然后像以前一样执行Setup或Verify方法。结论Moq.AutoMocker大大减少了在单位测试中编写重复Mock代码的数量简化了待测试类的生成。如果你使用Moq我强烈推荐它。如果你觉得这篇文章对你有所启发请关注我的个人公众号”My IO“记住我