如何在 asp.net 核心的 x-unit 单元测试中模拟 AutoMapper IConfigurationProvider
How to Mock AutoMapper IConfigurationProvider in x-unit unit testing in asp.net core
我正在为我的 UserRepository
class 编写单元测试,其中我使用 AutoMapper ProjectTo<T>
可查询扩展进行投影。这是 class 的样子:
public class UserRepository:IUserRepository
{
private readonly UserManager<UserEntity> _userManager;
private readonly IConfigurationProvider _mappingConfiguration;
public UserRepository(
UserManager<UserEntity> userManager,
IConfigurationProvider mappingConfiguration)
{
_userManager = userManager;
_mappingConfiguration = mappingConfiguration;
}
public async Task<IEnumerable<User>> GetUsersAsync()
{
IQueryable<UserEntity> query = _userManager.Users;
var size = await query.CountAsync();
var items = await query
.ProjectTo<User>(_mappingConfiguration)
.ToArrayAsync();
return items;
}
}
我正在使用 x-unit 单元测试项目。这是我的测试 class,
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 mockAutoMapper = new Mock<IConfigurationProvider>();
using (var context = new GallaContext(options, mockHttpContextAccessor.Object))
{
context.Database.OpenConnection();
context.Database.EnsureCreated();
var userRepository = new UserRepository( mockUserManager.Object, mockAutoMapper.Object);
// Act
var users = await userRepository.GetUsersAsync();
// Assert
users.Should().HaveCountGreaterOrEqualTo(1);
}
}
}
在我的存储库 class 中执行 ProjectTo<User>
时出现以下错误。
{System.NullReferenceException: Object reference not set to an
instance of an object. at
AutoMapper.QueryableExtensions.ProjectionExpression.ToCore[TResult](Object
parameters, IEnumerable`1 memberPathsToExpand)
我是最小起订量和单元测试的新手,我搜索了很多但找不到模拟这个的方法。请协助如何正确模拟 AutoMapper IConfigurationProvider
以及我的 MappingProfile
这是错误详情
System.NullReferenceException
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=AutoMapper
StackTrace:
at AutoMapper.QueryableExtensions.ProjectionExpression.ToCore[TResult](Object parameters, IEnumerable '1 memberPathsToExpand)
at AutoMapper.QueryableExtensions.Extensions.ProjectTo[TDestination](IQueryable source, IConfigurationProvider configuration, Expression`1[] membersToExpand)
at Repositories.UserRepository.<GetUsersAsync>d__5.MoveNext() in ..path\:line 46
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter '1.GetResult()
at Repositories.Test.UserRepositoryTests.<GetUsers_AtleastOne_ReturnOneOrMore>d__0.MoveNext() in ..path\Repositories.Test\UserRepositoryTests.cs:line 53
谢谢,
阿卜杜勒
这是我在@Fabio 评论后解决问题的方法。
var mockAutoMapper = new MapperConfiguration(mc => mc.AddProfile(new MappingProfile())).CreateMapper().ConfigurationProvider;
我正在为我的 UserRepository
class 编写单元测试,其中我使用 AutoMapper ProjectTo<T>
可查询扩展进行投影。这是 class 的样子:
public class UserRepository:IUserRepository
{
private readonly UserManager<UserEntity> _userManager;
private readonly IConfigurationProvider _mappingConfiguration;
public UserRepository(
UserManager<UserEntity> userManager,
IConfigurationProvider mappingConfiguration)
{
_userManager = userManager;
_mappingConfiguration = mappingConfiguration;
}
public async Task<IEnumerable<User>> GetUsersAsync()
{
IQueryable<UserEntity> query = _userManager.Users;
var size = await query.CountAsync();
var items = await query
.ProjectTo<User>(_mappingConfiguration)
.ToArrayAsync();
return items;
}
}
我正在使用 x-unit 单元测试项目。这是我的测试 class,
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 mockAutoMapper = new Mock<IConfigurationProvider>();
using (var context = new GallaContext(options, mockHttpContextAccessor.Object))
{
context.Database.OpenConnection();
context.Database.EnsureCreated();
var userRepository = new UserRepository( mockUserManager.Object, mockAutoMapper.Object);
// Act
var users = await userRepository.GetUsersAsync();
// Assert
users.Should().HaveCountGreaterOrEqualTo(1);
}
}
}
在我的存储库 class 中执行 ProjectTo<User>
时出现以下错误。
{System.NullReferenceException: Object reference not set to an instance of an object. at AutoMapper.QueryableExtensions.ProjectionExpression.ToCore[TResult](Object parameters, IEnumerable`1 memberPathsToExpand)
我是最小起订量和单元测试的新手,我搜索了很多但找不到模拟这个的方法。请协助如何正确模拟 AutoMapper IConfigurationProvider
以及我的 MappingProfile
这是错误详情
System.NullReferenceException
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=AutoMapper
StackTrace:
at AutoMapper.QueryableExtensions.ProjectionExpression.ToCore[TResult](Object parameters, IEnumerable '1 memberPathsToExpand)
at AutoMapper.QueryableExtensions.Extensions.ProjectTo[TDestination](IQueryable source, IConfigurationProvider configuration, Expression`1[] membersToExpand)
at Repositories.UserRepository.<GetUsersAsync>d__5.MoveNext() in ..path\:line 46
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter '1.GetResult()
at Repositories.Test.UserRepositoryTests.<GetUsers_AtleastOne_ReturnOneOrMore>d__0.MoveNext() in ..path\Repositories.Test\UserRepositoryTests.cs:line 53
谢谢,
阿卜杜勒
这是我在@Fabio 评论后解决问题的方法。
var mockAutoMapper = new MapperConfiguration(mc => mc.AddProfile(new MappingProfile())).CreateMapper().ConfigurationProvider;