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?
是的你是對的@Nkosi。謝謝 –
我用'userManagerMock'調用'GET'和'iUserManagerMock'來調用'POST'。如果我用你提出的模擬對象來模擬Get請求,那麼測試將不會執行經理類中GET方法的邏輯 –
然後你需要顯示更多的代碼,因爲答案是基於原始文章中的代碼針對特定問題。我相信Get的問題也會直接關係到你如何設置你的模擬。單元測試也可以孤立地完成。如果你在兩次測試之間共享模擬,你會遇到這個問題 – Nkosi