Как я могу выполнить модульное тестирование моего класса UnitOfWork с помощью NUnit? - PullRequest
0 голосов
/ 28 апреля 2020

Это мой класс UnitOfWork:

public class UnitOfWork : IUnitOfWork
    {
        protected SampleProjectDbContext _db { get; private set; }
        private IServiceProvider _serviceProvider;
        private bool _disposed;

        public UnitOfWork(SampleProjectDbContext db, IServiceProvider serviceProvider)
        {
            _db = db;
            _serviceProvider = serviceProvider;
        }

        // some code

        public IStudentRepository StudentRepository => _serviceProvider.GetRequiredService<IStudentRepository>();
        public ICourseRepository CourseRepository => _serviceProvider.GetService<ICourseRepository>();
        public IRegisteredCourseRepository RegisteredCourseRepository => _serviceProvider.GetService<IRegisteredCourseRepository>();
    }

Теперь, как я могу написать модульные тесты для свойства StudentRepository с помощью NUnit? Я не могу найти способ проверить свойство StudentRepository.

Это мой класс ServiceModuleExtentions:

public static class ServiceModuleExtentions
    {
        public static void RegisterInfrastructureServices(this IServiceCollection serviceCollection)
        {
            serviceCollection.AddScoped<IUnitOfWork, UnitOfWork>();
            serviceCollection.AddScoped<ICourseRepository, CourseRepository>();
            serviceCollection.AddScoped<IStudentRepository, StudentRepository>();
            serviceCollection.AddScoped<IRegisteredCourseRepository, RegisteredCourseRepository>();
        }
    }

, и я использую его следующим образом при запуске:

    public void ConfigureServices(IServiceCollection services)
            {
                // some code

                services.RegisterInfrastructureServices();
            }

Я проверяю это следующим образом, но выдает ошибку:

public class UnitOfWork_UnitTest
    {
        private UnitOfWork _unitOfWork;
        private Mock<IServiceProvider> _serviceProviderMock;
        private Mock<SampleProjectDbContext> _dbContextMock;

        [SetUp]
        public void Setup()
        {
            _serviceProviderMock = new Mock<IServiceProvider>();
            _dbContextMock = new Mock<SampleProjectDbContext>();
            _unitOfWork = new UnitOfWork(_dbContextMock.Object, _serviceProviderMock.Object);
        }

        [Test]
        public void Should_Return_IStudentRepository()
        {
            // Arrange
            _serviceProviderMock
                .Setup(x => x.GetService(typeof(IStudentRepository)))
                .Returns(It.IsAny<IStudentRepository>());

            // Act
            var result = _unitOfWork.StudentRepository;

            // Assert
            Assert.IsAssignableFrom<IStudentRepository>(result);
        }
    }

, и ошибка «System.InvalidOperationException: Служба для типа 'SampleProject.Core.Contracts.IStudentRepository' не зарегистрирована."

1 Ответ

1 голос
/ 29 апреля 2020

Измените свой метод Setup следующим образом:

_serviceProviderMock = new Mock<IServiceProvider>();
_serviceProviderMock
    .Setup(x => x.GetService(typeof(IStudentRepository)))
    .Returns(new StudentRepository());
_dbContextMock = new Mock<SampleProjectDbContext>();
_unitOfWork = new UnitOfWork(_dbContextMock.Object, _serviceProviderMock.Object);

Проблема в том, что вы в настоящее время вводите _serviceProviderMock в конструктор _unitOfWork до того, как настроите его. Вы также должны предоставить экземпляр вместо сопоставителя.

...