Reputation: 7341
I am trying to mock ApplicationUserManager.Users
so that I can test a controller method. My controller is
public class ManageController : Controller
{
private readonly ApplicationUserManager userManager;
public ManagerController(ApplicationUserManager userManager)
{
this.userManager = userManager;
}
// The method being tested
public ActionResult ListUsers()
{
// I want this to return my mocked user list
var users = this.userManager.Users.ToList();
// Do other stuff
}
}
My test method is
[TestMethod]
public void ListUsersGet_ShouldSucceed()
{
var users = new List<ApplicationUser>
{
new ApplicationUser { Id = "1", FirstName = "Test", LastName = "User" }
}.AsQueryable();
Mock<DbSet<ApplicationUser>> dbSet = new Mock<DbSet<ApplicationUser>>();
dbSet.As<IQueryable<ApplicationUser>>().Setup(e => e.ElementType).Returns(users.ElementType);
dbSet.As<IQueryable<ApplicationUser>>().Setup(e => e.Expression).Returns(users.Expression);
dbSet.As<IQueryable<ApplicationUser>>().Setup(e => e.GetEnumerator()).Returns(users.GetEnumerator());
dbSet.As<IQueryable<ApplicationUser>>().Setup(e => e.Provider).Returns(users.Provider);
Mock<MyContext> context = new Mock<MyContext>();
context.Setup(e => e.Users).Returns(dbSet.Object);
Mock<UserStore<ApplicationUser>> userStore = new Mock<UserStore<ApplicationUser>>(context.Object);
var controller = new ManageController(new ApplicationUserManager(userStore.Object));
var result = controller.ListUsers() as ViewResult;
// Assert some stuff
}
When I step into my controller method, I can see that users
is null. It appears that this.userManager.Users
isn't returning the users that I tried to set up in my test method.
How can I get this.userManager.Users.ToList()
to return my test users?
Upvotes: 2
Views: 955
Reputation: 247018
User manager exposes public virtual IQueryable<TUser> Users { get; }
property. Mock the user manager dependency and give that to the controller.
public void _ListUsersGet_ShouldSucceed() {
// Arrange.
var users = new List<ApplicationUser>
{
new ApplicationUser { Id = "1", FirstName = "Test", LastName = "User" }
}.AsQueryable();
//Only mocking this because we need it to initialize manager.
var userStore = Mock.Of<IUserStore<ApplicationUser>>();
var userManager = new Mock<ApplicationUserManager>(userStore);
userManager.Setup(_ => _.Users).Returns(users);
var controller = new ManageController(userManager.Object);
// Act.
var result = controller.ListUsers() as ViewResult;
// Assert some stuff
}
Check the Quick start documentation to get more acquainted with the mocking framework
Upvotes: 4