如何在asp.net core中的x-unit单元测试中模拟AutoMapper IConfigurationProvider

fin*_*s10 4 c# unit-testing moq xunit automapper

我正在为我的UserRepository班级编写单元测试,其中使用 AutoMapperProjectTo<T>可查询扩展进行投影。该类如下所示:

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用 x-unit 单元测试项目。这是我的测试课,

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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

在我的存储库类中执行时出现以下错误ProjectTo<User>

{System.NullReferenceException:未将对象引用设置为对象的实例。在 AutoMapper.QueryableExtensions.ProjectionExpression.ToCore[TResult](对象参数,IEnumerable`1 memberPathsToExpand)

我是最小起订量和单元测试的新手,我搜索了很多,但找不到模拟它的方法。IConfigurationProvider请协助我如何正确模拟 AutoMapperMappingProfile

这是错误详细信息

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
Run Code Online (Sandbox Code Playgroud)

谢谢,

阿卜杜勒

fin*_*s10 6

以下是我解决@Fabio 评论的方法,并且有效。

var mockAutoMapper = new MapperConfiguration(mc => mc.AddProfile(new MappingProfile())).CreateMapper().ConfigurationProvider;
Run Code Online (Sandbox Code Playgroud)