2016-04-21 21 views
2

這裏是我的代碼ReturnsAsync中起訂量是不工作

public interface IUserManager 
{ 
    Task<int> PostUser(User user); 
    IQueryable<User> GetUserById(long userId); 
} 

public class UserManager : IUserManager 
{ 
    public UserManager(DataContext context) 
    { 
     this.DataContext = context; 
    } 
    public async Task<int> PostUser(User user) 
    { 
     this.DataContext.User.Add(user); 
     return await this.DataContext.SaveChangesAsync().ConfigureAwait(false); 
    } 

    public IQueryable<User> GetUserById(long userId) 
    { 
     return this.DataContext.User 
     .Where(userNotes => userNotes.UserId == userId).AsQueryable(); 
    } 
} 

控制器:

public class UserController : BaseController 
{ 
    private readonly IUserManager userManager; 

    public UserController() 
    { 
     this.userManager = new UserManager(); 
    } 

    public UserController(IUserManager userManager) 
    { 
     this.userManager = userManager; 
    } 

    [EnableQuery] 
    public IQueryable<User> Get([FromODataUri]long userId) 
    { 
     return this.userManager.GetUserById(userId); 
    } 

    public HttpResponseMessage Post(User user) 
    { 
     if (userNote == null || !ModelState.IsValid) 
     { 
      return this.BuildErrorResponse(ResponseCodes.INVALID_MISSING_INPUTS); 
     } 

     if (this.userManager.PostUser(user).Result <= 0) 
     { 
      return this.BuildErrorResponse(ResponseCodes.USER_ADD_FAILED); 
     } 

     return this.BuildSuccessResponse<User>(ResponseCodes.USER_ADDED, user); 
    } 
} 

起訂量測試:

[TestClass] 
public class UnitTest 
{ 
    IUserManager userManagerMock; 
    Mock<IUserManager> iUserManagerMock; 

    [TestInitialize] 
    public void Setup() 
    { 
     //.. setup variables and mock data 
     userManagerMock = new UserManager(ContextMock.Object); 
     iUserManagerMock.Setup(u => u.PostUser(It.IsAny<User>())) 
       .ReturnsAsync(1); 
    } 

    [TestMethod] 
    public void Post() 
    { 
     var controller = new UserController(userManagerMock); //userNotesManagerMock will have the mock data           //and mock methods setup 
      var httpResponse = controller.Post(userPostMock); //userPostMock will have mock data to save 

      //Assert.AreEqual(HttpResponseMessage, result); 
    } 
} 

我寫了一篇方法,你會看到這裏。我也有一個Get方法,它可以很好地處理模擬數據。

但是當我通過Post調試數據時,下面的語句總是返回ZERO而不是1,這是我在ReturnsAsync中設置的。

this.userManager.PostUser(user).Result <= 0 //this always gives me zero 

這篇文章有什麼問題?我做錯了什麼?

任何人都可以闡明這


編輯

這裏是一些光現在是試驗方法的GET版本和安裝

[TestInitialize] 
public void Setup() 
{ 
    //dummy data setup 
    UserMock = new List<User> 
    { 
     new User { //blah blah properties } 
    }.AsQueryable(); 

    //context setup 
    dbSetUserMock = new Mock<IDbSet<User>>(); 
    dbSetUserMock.Setup(m => m.Provider).Returns(UserMock.Provider); 
    dbSetUserMock.Setup(m => m.Expression).Returns(UserMock.Expression); 
    dbSetUserMock.Setup(m => m.ElementType).Returns(UserMock.ElementType); 
    dbSetUserMock.Setup(m => m.GetEnumerator()).Returns(UserMock.GetEnumerator()); 

    UserContextMock = new Mock<DataContext>(); 
    UserContextMock.Setup(s => s.User).Returns(dbSetUserMock.Object); 

    //inject the context to manager 
    UserManagerMock = new UserManager(UserContextMock.Object); 

    iUserManagerMock = new Mock<IUserManager>(); 
    iUserManagerMock.Setup(notes => notes.PostUserNote(It.IsAny<User>())) 
     .ReturnsAsync(1); 
} 

[TestMethod] 
public void Get_User_Success() 
{ 
    var controller = new UserController(UserManagerMock); 
    var values = controller.Get(100); 

    Assert.AreEqual(100, values.FirstOrDefault().UserId); 
} 

Get_User_Success作品很好地與假數據集和我能夠通過測試沒有iUserManagerMock對象。原因是我想執行Manager類中的GetUser()方法中的代碼。

我還有另一個問題在這裏。由於我在PostAs操作的ReturnAsync中將預期結果設置爲1。如何爲故障案例場景構建測試方法,因爲POST方法的返回值在故障情況下仍然爲1?

回答

1

你正在混淆設置。如果被測方法是,並且您想通過IUserManager接口模擬UserManager,則不需要手動新建一個。

[TestClass] 
public class UnitTest { 

    [TestMethod] 
    public void UserController_Should_Post_User_Ok() { 
     //Arrange 
     var userPostMock = new User { UserId = 100 }; 
     var userManagerMock = new Mock<IUserManager>(); 
     userManagerMock.Setup(u => u.PostUser(It.IsAny<User>())).ReturnsAsync(1); 
     var controller = new UserController(userManagerMock.Object); 
     controller.Request = new HttpRequestMessage(); 
     controller.Configuration = new HttpConfiguration(); 

     //Act 
     var httpResponse = controller.Post(userPostMock); 

     //Assert 
     Assert.AreEqual(System.Net.HttpStatusCode.OK, httpResponse.StatusCode); 
    } 

    [TestMethod] 
    public void UserController_Should_Post_User_Fail() { 
     //Arrange 
     var userPostMock = new User { UserId = 100 }; 
     var userManagerMock = new Mock<IUserManager>(); 
     userManagerMock.Setup(u => u.PostUser(It.IsAny<User>())).ReturnsAsync(0);//Replicating a failed post 
     var controller = new UserController(userManagerMock.Object); 
     controller.Request = new HttpRequestMessage(); 
     controller.Configuration = new HttpConfiguration(); 

     //Act 
     var httpResponse = controller.Post(userPostMock); 

     //Assert 
     Assert.AreEqual(System.Net.HttpStatusCode.InternalServerError, httpResponse.StatusCode); 
    } 

    [TestMethod] 
    public void UserManager_Should_Get_User_Success() { 
     //Arrange 
     var userMock = new List<User> 
     { 
      new User(){ UserId=100 } 
     }.AsQueryable(); 

     //context setup 
     var dbSetUserMock = new Mock<IDbSet<User>>(); 
     dbSetUserMock.Setup(m => m.Provider).Returns(userMock.Provider); 
     dbSetUserMock.Setup(m => m.Expression).Returns(userMock.Expression); 
     dbSetUserMock.Setup(m => m.ElementType).Returns(userMock.ElementType); 
     dbSetUserMock.Setup(m => m.GetEnumerator()).Returns(userMock.GetEnumerator()); 

     var userContextMock = new Mock<DataContext>(); 
     userContextMock.Setup(s => s.User).Returns(dbSetUserMock.Object); 
     //inject the context to manager 
     var userManagerMock = new UserManager(userContextMock.Object); 

     //Act 
     var values = userManagerMock.GetUserById(100); 

     //Assert 
     Assert.AreEqual(100, values.FirstOrDefault().UserId); 
    } 
} 
+1

是的你是對的@Nkosi。謝謝 –

+0

我用'userManagerMock'調用'GET'和'iUserManagerMock'來調用'POST'。如果我用你提出的模擬對象來模擬Get請求,那麼測試將不會執行經理類中GET方法的邏輯 –

+0

然後你需要顯示更多的代碼,因爲答案是基於原始文章中的代碼針對特定問題。我相信Get的問題也會直接關係到你如何設置你的模擬。單元測試也可以孤立地完成。如果你在兩次測試之間共享模擬,你會遇到這個問題 – Nkosi