我有一个控制器:
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);
}
我觉得我的Mocking功能使用不正确。特别是在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=neutral, PublicKeyToken=null]]。 找不到无参构造函数。'
UserManager
是一个应该被抽象出来的实现关注点。这样会使得模拟和注入更加容易。 - NkosiAuthorizationAttribute
的实际工作。因为AuthorizationAttribute
被中间件所使用。要测试它,您需要测试整个管道:创建客户端(HttpClient
),启动您的WebAPI,向您正在测试的URL发送请求并对响应进行断言。 - Fabio