2016-11-11 51 views
1

在這方面有點麻煩。我正嘗試第一次使用Moq。最小起訂量從參數方法返回新對象

我有一個接口:

public interface IUserService 
{ 
    void SignOut(string username); 
    AuthenticationResult Authenticate(string username, string password); 
    Models.Users.ApplicationUser GetAvailibleUserDetails(string username); 
    List<ApplicationUser> GetAvailibleUsers(); 
    List<ApplicationUser> GetApplicationUsers(); 
    ApplicationUser GetUser(Expression<Func<ApplicationUser, bool>> filter); 
    ApplicationUser AddUser(string username, List<string> environmentIds, bool isAdmin =false); 
    ApplicationUser UpdateUser(string id, List<string> environmentIds, bool isAdmin = false); 
    void DeleteUser(string id); 
} 

使用使用System.DirectoryServices.AccountManagement庫AD身份驗證的身份驗證方法。

下面是該方法的實現:

public AuthenticationResult Authenticate(string username, string password) 
    { 
     UserPrincipal userPrincipal = null; 

     var isAuthenticated = _adManager.ValidateUser(username, password); 

     if (isAuthenticated) 
     { 
      userPrincipal = _adManager.GetUserPrincipal(username); 
     } 


     if (!isAuthenticated || userPrincipal == null) 
     { 
      return new AuthenticationResult("Username or Password is not correct"); 
     } 

     if (userPrincipal.IsAccountLockedOut()) 
     { 
      // here can be a security related discussion weather it is worth 
      // revealing this information 
      return new AuthenticationResult("Your account is locked."); 
     } 

     if (userPrincipal.Enabled.HasValue && userPrincipal.Enabled.Value == false) 
     { 
      // here can be a security related discussion weather it is worth 
      // revealing this information 
      return new AuthenticationResult("Your account is disabled"); 
     } 

     //Determine if the user is authorized to use the application 
     var user = _userManager.GetUser(u => u.LdapId == userPrincipal.Sid.Value); 
     if (user == null) 
     { 
      return new AuthenticationResult("You are not authorized to use this application"); 
     } 

     var identity = CreateIdentity(userPrincipal, user); 

     _authenticationManager.SignOut("MAG.EPM"); 
     _authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, identity); 


     return new AuthenticationResult(); 
    } 

這裏是我的測試類和方法:

public class UserServiceTest 
{ 
    private readonly Mock<IActiveDirectoryManager> _adManager; 
    private readonly Mock<UserPrincipalWrapper> _userPrincipal; 
    private readonly Mock<IUserManager> _userManager; 
    private readonly Mock<IAuthenticationManager> _authenticationManager; 

    public UserServiceTest() 
    { 
     _userPrincipal = new Mock<UserPrincipalWrapper>(); 
     _userManager = new Mock<IUserManager>(); 
     _adManager = new Mock<IActiveDirectoryManager>(); 
     _authenticationManager = new Mock<IAuthenticationManager>(); 
    } 

    [TestMethod] 
    public void Authenticate_ValidActiveDirectoryUser_Authenticated() 
    { 
     _userPrincipal.Setup(x => x.IsAccountLockedOut()).Returns(false); 
     _userPrincipal.SetupGet(x => x.Enabled).Returns(true); 


     _adManager.Setup(x => x.ValidateUser("testUser", "password")).Returns(true); 
     _adManager.Setup(x => x.GetUserPrincipal("testUser")).Returns(_userPrincipal.Object); 

     _userManager.Setup(x => x.GetUser(u => u.LdapId == Guid.NewGuid().ToString())).Returns(new ApplicationUser()); 

     IUserService userService = new UserService(_userManager.Object, _authenticationManager.Object, _adManager.Object); 


     Assert.IsTrue(userService.Authenticate("testUser", "password").IsSuccess); 

    } 

} 

的問題是我正在從返回對象的用戶空引用

//Determine if the user is authorized to use the application 
     var user = _userManager.GetUser(u => u.LdapId == userPrincipal.Sid.Value); 
     if (user == null) 
     { 
      return new AuthenticationResult("You are not authorized to use this application"); 
     } 

基於我的設置 - 它應該只是返回一個new ApplicationUser()

其他一切工作正常。

的IUserManager界面看起來像:

public interface IUserManager 
{ 
    List<ApplicationUser> GetUsers(Expression<Func<ApplicationUser, bool>> filter = null); 
    ApplicationUser GetUser(Expression<Func<ApplicationUser, bool>> filter); 
    ApplicationUser AddUser(string username, List<string> environmentIds, bool isAdmin = false); 
    void DeleteUser(string username); 
    ApplicationUser UpdateUser(string id, List<string> environmentIds, bool isAdmin = false); 
    IList<string> GetUserRoles(string id); 


} 

所以對於_userManager.Setup(u => u.LdapId == Guid.NewGuid().tostring())).Returns(new ApplicationUser());

我試圖取代_userManager.GetUser(u => u.LdapId == userPrincipal.Sid.Value);

我曾嘗試與

_userManager.Setup(x => x.GetUser(u => u.LdapId == _userPrincipal.Object.Sid.Value)).Returns(new ApplicationUser()); 
替代測試方法

以匹配t中的呼叫他的實現,但我在_userPrincipal對象上得到一個空引用異常(「對象未設置...」)。

回答

3

試試這樣說:

userService 
    .Setup(s => s.GetUser(It.IsAny<Expression<Func<ApplicationUser, bool>>>())) 
    .Returns(new ApplicationUser()); 
+0

真棒。謝謝! – JDBennett