我正在嘗試使用測驗 Microsoft.AspNetCore.Identity 用戶管理器的 Moq 創建單元測驗。我知道 Moq 適合模擬介面,但 UserManager 沒有介面。
這是我的代碼:
Mock<UserManager<User>> userManagerMock = new Mock<UserManager<User>>();
// rest of my code ...
這是錯誤:
Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class: Microsoft.AspNetCore.Identity.UserManager`1[[WebAPI.Core.Model.User, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].
Could not find a parameterless constructor.
uj5u.com熱心網友回復:
您可以使用Moq. 您只需要Mock使用有效的建構式引數創建一個新的。在你的情況下:
var userManagerMock = new Mock<UserManager<User>>(Mock.Of<IUserStore<User>>(), null, null, null, null, null, null, null, null);
在為類創建新的模擬時,Moq 使用類的建構式之一,在UserManager類中,有一個帶有 9 個引數的建構式:
UserManager<TUser>(IUserStore<TUser>, IOptions<IdentityOptions>, IPasswordHasher<TUser>, IEnumerable<IUserValidator<TUser>>, IEnumerable<IPasswordValidator<TUser>>, ILookupNormalizer, IdentityErrorDescriber, IServiceProvider, ILogger<UserManager<TUser>>)
唯一必須的引數是第一個,所有其他引數都可以傳遞null值。
現在您可以設定任何虛擬方法或屬性。
完整示例:
[TestMethod]
public void MockUserManager()
{
// Arrange
var userManagerMock = new Mock<UserManager<User>>(Mock.Of<IUserStore<User>>(), null, null, null, null, null, null, null, null);
userManagerMock.Setup(x => x.CheckPasswordAsync(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(true);
// Act
var res = userManagerMock.Object.CheckPasswordAsync(new User(), "123456").Result;
// Assert
Assert.IsTrue(res);
}
public class User
{
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/391808.html
