2017-09-06 61 views
1

我有一些问题,我的测试应用ASP.NET MVC 5这样起订量表示构造参数不能过去了接口嘲笑

Castle.Proxies.IdentityUserLogin:的EntityType“IdentityUserLogin”没有定义的关键。定义此EntityType的关键字。 Castle.Proxies.IdentityUserRole :: EntityType'IdentityUserRole'没有定义键。定义此EntityType的关键字。 IdentityUserLogins:EntityType:EntitySet'IdentityUserLogins'基于没有定义键的类型'IdentityUserLogin'。 IdentityUserRoles:EntityType:EntitySet'IdentityUserRoles'基于没有定义键的类型'IdentityUserRole'。

我测试了UserService,我使用的是Moq和NUnit框架。我sovled所有问题,当我加入这个:

var mockContext = new Mock<SomeContext>() { CallBase = true }; 

但现在我有这样的问题:

留言信息:System.ArgumentException:构造函数参数不能过去了接口嘲笑。

如果你愿意,你可以检查我下面的代码,但我认为,问题只在“mockContext”

[Test, TestCaseSource(typeof(UserServiceTestData), nameof(UserServiceTestData.WrongCreateUserTestCases))] 
    public void ShouldWrongUserCreationTest(UserDTO userDto) 
    { 
     //Arrange 
     var user = new ApplicationUser 
     { 
      Email = "test", 
      Roles = { new IdentityUserRole { UserId = "test", RoleId = "test" } }, 
      ClientProfile = new ClientProfile { Name = "test" } 
     }; 

     var mockStore = new Mock<IUserStore<ApplicationUser>>(); 
     mockStore.Setup(x => x.FindByIdAsync(It.IsAny<string>())).Returns(Task.FromResult(user)); 
     mockStore.As<IUserEmailStore<ApplicationUser>>().Setup(x => x.FindByEmailAsync("existed")).Returns(Task.FromResult((ApplicationUser)null)); 
     mockStore.As<IUserPasswordStore<ApplicationUser>>(); 
     mockStore.As<IUserRoleStore<ApplicationUser>>().Setup(x => x.AddToRoleAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>())) 
      .Returns(Task.FromResult(IdentityResult.Success)); 
     mockStore.As<IUserRoleStore<ApplicationUser>>().Setup(x => x.GetRolesAsync(It.IsAny<ApplicationUser>())) 
      .Returns(Task.FromResult((IList<string>)new List<string>())); 
     mockStore.Setup(x => x.CreateAsync(It.IsAny<ApplicationUser>())) 
      .Returns(Task.FromResult(IdentityResult.Success)); 

     var mockDbSet = new Mock<DbSet<ClientProfile>>(MockBehavior.Strict); 
     mockDbSet.Setup(x => x.Add(It.IsAny<ClientProfile>())).Returns(new ClientProfile()); 

     var userManager = new ApplicationUserManager(mockStore.Object); 
     var mockContext = new Mock<AuthenticationContext>() { CallBase = true }; 
     var mock = new Mock<IIdentityUnitOfWork>(mockContext.Object); 
     mock.Setup(a => a.UserManager).Returns(userManager); 

     //Act 
     var userService = new UserService(mock.Object); 
     OperationDetails result = userService.Create(userDto); 

     //Assert 
     Assert.That(result.Succedeed, Is.False); 
    } 

回答

1

我猜问题是在这一行:通过创建

var mock = new Mock<IIdentityUnitOfWork>(mockContext.Object); 

动态类基于IIdentityUnitOfWork的moq只有默认的构造函数,它不知道如何处理mockContext.Object。 从模拟构造函数中删除mockContext.Object应该可以解决您的问题。

+0

是的!我决定了这个问题!你也是对的,但这是不正确的测试数据,我已经明白它是如何工作的。谢谢你的帮助 –