I'm new to unit test and Moq. I have a repository class to retrieve users. Here is the repository class code:
public class UserRepository : IUserRepository
{
private readonly UserManager<UserEntity> _userManager;
private readonly IMapper _mapper;
public UserRepository(
UserManager<UserEntity> userManager,
IMapper mapper)
{
_userManager = userManager;
_mapper = mapper;
}
public async Task<IEnumerable<User>> GetUsersAsync(
PagingOptions pagingOptions)
{
IQueryable<UserEntity> query = _userManager.Users;
// query = searchOptions.Apply(query);
// query = sortOptions.Apply(query);
var size = await query.CountAsync();
var items = await query
.Skip(pagingOptions.Offset.Value)
.Take(pagingOptions.Limit.Value)
.ProjectTo<User>(_mapper.ConfigurationProvider)
.ToArrayAsync();
return items;
}
}
This works fine when I run the application normally as shown in the below image.
But When I run the same code using x-unit unit test project, I get the below error when executing var size = await query.CountAsync();
:
The provider for the source IQueryable doesn't implement IAsyncQueryProvider. Only providers that implement IAsyncQueryProvider can be used for Entity Framework asynchronous operations.
Here is my unit test code:
public class UserRepositoryTests
{
[Fact]
public async void GetUsers_AtleastOne_ReturnOneOrMore()
{
// Arrange
var connectionStringBuilder =
new SqliteConnectionStringBuilder { DataSource = ":memory:" };
var connection = new SqliteConnection(connectionStringBuilder.ToString());
var options = new DbContextOptionsBuilder<GallaContext>()
.UseSqlite(connection)
.Options;
var mockHttpContextAccessor = new Mock<IHttpContextAccessor>();
var mockUserManager = new Mock<UserManager<UserEntity>>(new Mock<IUserStore<UserEntity>>().Object,
new Mock<IOptions<IdentityOptions>>().Object,
new Mock<IPasswordHasher<UserEntity>>().Object,
new IUserValidator<UserEntity>[0],
new IPasswordValidator<UserEntity>[0],
new Mock<ILookupNormalizer>().Object,
new Mock<IdentityErrorDescriber>().Object,
new Mock<IServiceProvider>().Object,
new Mock<ILogger<UserManager<UserEntity>>>().Object);
var autoMapper = new MapperConfiguration(mc => mc.AddProfile(new MappingProfile())).CreateMapper();
var pagingOptions = new PagingOptions
{
Limit = 25,
Offset = 0
};
using (var context = new GallaContext(options, mockHttpContextAccessor.Object))
{
context.Database.OpenConnection();
context.Database.EnsureCreated();
var userRepository = new UserRepository(mockUserManager.Object, autoMapper);
// Act
var users = await userRepository.GetUsersAsync(pagingOptions);
// Assert
users.Should().HaveCountGreaterOrEqualTo(1);
}
}
}
Am I mocking the UserManager
wrongly? Also my context class has data to be added in database in OnModelCreating
method. So the context has data when context.Database.EnsureCreated();
is called in unit test. Here is the screenshot of the error image while running unit test
Thanks,
Abdul