C# 如何使用NUnit对UnitOfWork类进行单元测试?

C# 如何使用NUnit对UnitOfWork类进行单元测试?,c#,unit-testing,asp.net-core,nunit,unit-of-work,C#,Unit Testing,Asp.net Core,Nunit,Unit Of Work,这是我的UnitOfWork课程: public class UnitOfWork : IUnitOfWork { protected SampleProjectDbContext _db { get; private set; } private IServiceProvider _serviceProvider; private bool _disposed; public UnitOfWork(SampleProje

这是我的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>();
    }
我这样测试它,但它会产生错误:

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);
        }
    }
公共类UnitOfWork\u UnitTest
{
私人工作单位(Unitof Work);;
私人模拟服务提供商;
私有Mock_dbContextMock;
[设置]
公共作废设置()
{
_serviceProviderMock=new Mock();
_dbContextMock=新Mock();
_unitOfWork=新unitOfWork(_dbContextMock.Object,_serviceProviderMock.Object);
}
[测试]
public void应该返回
{
//安排
_serviceProviderMock
.Setup(x=>x.GetService(typeof(IStudentRepository)))
.Returns(It.IsAny());
//表演
var结果=_unitOfWork.StudentRepository;
//断言
Assert.IsAssignableFrom(结果);
}
}

错误为“System.InvalidOperationException:没有注册'SampleProject.Core.Contracts.IStudentRepository'类型的服务。”

设置更改为:

\u serviceProviderMock=new Mock();
_serviceProviderMock
.Setup(x=>x.GetService(typeof(IStudentRepository)))
.Returns(newstudentrepository());
_dbContextMock=新Mock();
_unitOfWork=新unitOfWork(_dbContextMock.Object,_serviceProviderMock.Object);

问题是,您当前正在将
\u serviceProviderLock
注入
\u unitOfWork
构造函数,然后再进行设置。您还需要提供一个实例而不是匹配器。

我在该类中没有看到任何需要测试的内容。没有逻辑,它只是封装了一堆属性_dbContextMock=新Mock()_Setup(x=>x.GetService(typeof(IStudentRepository))).Returns(newstudentrepository(_dbContextMock.Object))_unitOfWork=新unitOfWork(_dbContextMock.Object,_serviceProviderMock.Object)成功了。
    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);
        }
    }