Как смоделировать AutoMapper IConfigurationProvider в модульном тестировании x-unit в ядре asp.net - PullRequest
0 голосов
/ 04 июля 2019

Я пишу модульный тест для моего UserRepository класса, где я использую AutoMapper ProjectTo<T> Queryable Extensions для проецирования.Вот как выглядит класс:

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.Вот мой тестовый класс,

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);
            }
        }
    }

Я получаю следующую ошибку при выполнении ProjectTo<User> в моем классе репозитория.

{System.NullReferenceException: ссылка на объект не установленак экземпляру объекта.at AutoMapper.QueryableExtensions.ProjectionExpression.ToCore [TResult] (Параметры объекта, IEnumerable`1 memberPathsToExpand)

Я новичок в Moq и модульном тестировании, я много искал, но не смог найти способИздеваться над этим.Пожалуйста, помогите, как правильно Mock 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

Спасибо,

Abdul

1 Ответ

1 голос
/ 07 июля 2019

Вот как я решил следующие комментарии @Fabio, и это работает.

var mockAutoMapper = new MapperConfiguration(mc => mc.AddProfile(new MappingProfile())).CreateMapper().ConfigurationProvider;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...