Как передать мой объект DbContext для тестирования с помощью xunit и moq - PullRequest
0 голосов
/ 14 июля 2020

Ниже указана функция тестирования, которая проверяет, существуют ли сведения для конкретного идентификатора транзакции.

        [Fact]
        public async Task GetAllBlobDetails_Test()
        {
           _serviceScopeFactory.Setup(x => x.CreateScope().ServiceProvider.GetRequiredService<MriDbContext>()).Returns(_context);
           BlobStatusEntity blobStatusEntity =  await _bspRepository.GetBlobDetails("123");
           Assert.NotNull(blobStatusEntity)
        }

где _serviceScopeFactory равно

Mock<IServiceScopeFactory> _serviceScopeFactory = new Mock<IServiceScopeFactory>();
(Microsoft.Extensions.DependencyInjection)

В приведенной выше функции он вызывает _bspRepository.GetBlobDetails для конкретный идентификатор транзакции ("123")

Итак, вот определение GetBlobDetails

 public async Task<BlobStatusEntity> GetBlobDetails(string transactionId)
        {

                if (String.IsNullOrEmpty(transactionId))
                {
                    throw new ArgumentNullException(nameof(transactionId));
                }

                MriDbContext mriDbcontext = _scopeFactory.CreateScope().ServiceProvider.GetRequiredService<MriDbContext>();

                return await mriDbContext.BlobStatus.FirstOrDefaultAsync(ele => ele.TransactionId == transactionId);
        }

, где _scopeFactory - это IServiceScopeFactory _scopeFactory, которое вводится из конструктора.

Когда я Я запускаю вышеуказанную тестовую функцию GetAllBlobDetails_Test, я получаю следующую ошибку.

Message: 
    System.NotSupportedException : Unsupported expression: ... => ....GetRequiredService<MriDbContext>()
    Extension methods (here: ServiceProviderServiceExtensions.GetRequiredService) may not be used in setup / verification expressions.

Я новичок в moq и xunit.

Пожалуйста, помогите мне решить эту проблему.

Заранее спасибо

1 Ответ

2 голосов
/ 14 июля 2020

Итак, причина root в том, что вы не можете имитировать метод расширения в Moq

Вы делаете это здесь:

 _serviceScopeFactory.Setup(x => x.CreateScope().ServiceProvider.GetRequiredService<MriDbContext>()).Returns(_context);

GetRequiredService<T> - это расширение метод, расширяющий IServiceProvider, который вы можете видеть здесь

В зависимости от того, какой конкретный случай c вы пытаетесь протестировать (тестируете ли вы создание контекста или записать в БД?), вы должны иметь возможность переписать свой тест, чтобы избежать имитации метода расширения и имитации методов экземпляра publi c, используемых вместо этого. Вы даже можете поиздеваться над фактическим методом экземпляра на IServiceProvider, если действительно хотите сохранить существующую структуру.

Дальнейшее обсуждение этого топа c существует здесь . В этом вопросе используется MSTest, а не XUnit, но ваша проблема здесь указана c на Moq.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...