模拟-无法实例化属性的代理类?

Eva*_*kis 5 c# nunit moq mocking

在我的测试中,这是我的代码:

[SetUp]
public void Initialise()
{
    mockOwinManager = new Mock<IOwinManager<ApplicationUser, ApplicationRole>>();
    mockSearch = new Mock<ISearch<ApplicationUser>>();
    mockMail = new Mock<IRpdbMail>();
    mockUserStore = new Mock<IUserStore<ApplicationUser>>();

    mockOwinManager.Setup(x => x.UserManager).Returns(() => new AppUserManager(mockUserStore.Object));

    sut = new UsersController(mockOwinManager.Object, mockSearch.Object, mockMail.Object);
}
Run Code Online (Sandbox Code Playgroud)

然后测试本身:

[Test]
public void WhenPut_IfUserIsNullReturnInternalServerError()
{
    //Arrange
    mockOwinManager.Setup(x => x.UserManager.FindByIdAsync(It.IsAny<string>())).Returns(() => null);

    //Act
    var response = sut.Put(new AppPersonUpdate());

    //Assert
    Assert.AreEqual(response.Result.StatusCode, HttpStatusCode.InternalServerError);
}
Run Code Online (Sandbox Code Playgroud)

但是我的安排行抛出以下错误:

无法实例化以下类的代理:Microsoft.AspNet.Identity.UserManager`1 [[SWDB.BusinessLayer.Identity.ApplicationUser,SWDB.BusinessLayer,版本= 1.0.0.0,Culture = neutral,PublicKeyToken = null]]。找不到无参数的构造函数。

为什么会这样,因为在安装程序中,我已经将我的嘲讽OwinManager的UserManager属性设置为我希望它返回的值?

Afa*_*faq 5

首先创建一个模拟对象UserManager。然后设置它的虚拟方法FindByIdAsync(假设属性的类型UserManager是一个类AppUserManager,并且假设这个类实现了IAppUserManager)。

var yourMockOfUserManager = new Mock<IAppUserManager>();
yourMockOfUserManage.Setup(x=>x.FindByIdAsync(It.IsAny<string>())).Returns(() => null);
Run Code Online (Sandbox Code Playgroud)

最后

mockOwinManager.Setup(x => x.UserManager).Returns(() => yourMockOfUserManager.Object);
Run Code Online (Sandbox Code Playgroud)