【发布时间】:2018-09-29 05:22:44
【问题描述】:
我有一个控制器:
public class InvitationsController: Controller {
private readonly IMapper _mapper;
private readonly IInvitationManager _invitationManager;
private readonly UserManager<MyAppUser> _userManager;
public InvitationsController(
IInvitationManager invitationManager,
IMapper mapper,
UserManager<MyAppUser> userManager,
IJobManager jobManager
) {
_invitationManager = invitationManager;
_mapper = mapper;
_userManager = userManager;
}
[Authorization]
GetInvitationByCode(string code) { ... }
我正在尝试使用 Xunit 和 Moq 编写单元测试。这是我的测试的实现:
public class InvitationsControllerTests {
private Mock<IInvitationManager> invitationManagerMock;
private Mock<UserManager<MyAppUser>> userManagerMock;
private Mock<IMapper> mapperMock;
private InvitationsController controller;
public InvitationsControllerTests() {
invitationManagerMock = new Mock<IInvitationManager>();
userManagerMock = new Mock<UserManager<MyAppUser>>();
mapperMock = new Mock<IMapper>();
controller = new InvitationsController(invitationManagerMock.Object,
mapperMock.Object,
userManagerMock.Object);
}
[Fact]
public async Task GetInvitationByCode_ReturnsInvitation() {
var mockInvitation = new Invitation {
StoreId = 1,
InviteCode = "123abc",
};
invitationManagerMock.Setup(repo =>
repo.GetInvitationByCodeAsync("123abc"))
.Returns(Task.FromResult(mockInvitation));
var result = await controller.GetInvitationByCode("123abc");
Assert.Equal(mockInvitation, result);
}
我认为我没有正确使用模拟功能。特别是与 UserManager。我找不到关于使用 Moq 测试受 [Authorize] 保护的控制器的明确答案。运行我的测试时,它会引发异常
controller = new InvitationsController(invitationManagerMock.Object,
mapperMock.Object,
userManagerMock.Object);
内容如下:
Castle.DynamicProxy.InvalidProxyConstructorArgumentsException: '无法实例化类的代理:Microsoft.AspNetCore.Identity.UserManager`1[[MyApp.api.Core.Models.MyAppUser, MyApp.api, Version=1.0.0.0, Culture=中性,PublicKeyToken=null]]。 找不到无参数构造函数。'
【问题讨论】:
-
UserManager是一个应该被抽象出来的实现问题。将使模拟和注入更容易。 -
在测试控制器类时,您将无法测试
AuthorizationAttribute的实际工作。因为AuthorizationAttribute被中间件消耗。对于您需要测试完整管道的测试:创建客户端(HttpClient),启动您的 WebAPI,向您正在测试的 url 发送请求并断言响应。
标签: c# unit-testing asp.net-core moq