2017-09-06 67 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

是的!我決定了這個問題!你也是對的,但這是不正確的測試數據,我已經明白它是如何工作的。謝謝你的幫助 –