How to mock Asp.net identity UserManager's CreateAsync method
asp.net, c#, moq
Solution
You need to mock the call to FindByNameAsync, because that is what UserManager will call:
public void Can_Create_User()
{
//Arrange
var dummyUser = new ApplicationUser() { UserName = "PinkWarrior", Email = "PinkWarrior@PinkWarrior.com" };
var mockStore = new Mock<IUserStore<ApplicationUser>>();
var userManager = new UserManager<ApplicationUser>(mockStore.Object);
mockStore.Setup(x => x.CreateAsync(dummyUser))
.Returns(Task.FromResult(IdentityResult.Success));
mockStore.Setup(x => x.FindByNameAsync(dummyUser.UserName))
.Returns(Task.FromResult(dummyUser));
//Act
Task<IdentityResult> tt = (Task<IdentityResult>)mockStore.Object.CreateAsync(dummyUser);
var user = userManager.FindByName("PinkWarrior");
//Assert
Assert.AreEqual("PinkWarrior", user.UserName);
}
However, I believe with such test you are testing Microsoft.AspNet.Identity.UserManager and not your code. What you are proving is that UserManager somehow calls your mockStore.
Source code for Microsoft.AspNet.Identity contains these type of tests.
Problem
I am trying to mock the UserStore's `CreateAsync` method to have an in-memory user store. ``` public void Can_Create_User() { //Arrange var dummyUser = new ApplicationUser() { UserName = "PinkWarrior", Email = "PinkWarrior@PinkWarrior.com" }; var mockStore = new Mock<IUserStore<ApplicationUser>>(); var userManager = new UserManager<ApplicationUser>(mockStore.Object); mockStore.Setup(x => x.CreateAsync(dummyUser)) .Returns(Task.FromResult(IdentityResult.Success)); //Act Task<IdentityResult> tt = (Task<IdentityResult>)mockStore.Object.CreateAsync(dummyUser); var user = userManager.FindByName("PinkWarrior"); //Assert Assert.AreEqual("PinkWarrior", user.UserName); } ``` The `user` above is always null, because I'm never inserting it . So the problem I have is how can I make userManager,which isn't a mock return a user from my mock store? This answer was somewhat similar but doesn't answer my question here. Any help greatly appreciated