模拟 UnitOfWork / GenericRepository 实现

Mocking UnitOfWork / GenericRepository Implementation

我关注了this SO answer一个类似的问题,(下面是第二个答案的实现)

我正在想办法测试:

 public async Task<string> DoWork()
        {
            return await _testRepository.GetAsync(); <-- how do I test here???
        }

例子Class

using System.Threading.Tasks;
using Test.DataAccess.Core;
using Test.DataAccess.Repository;

namespace Test.DataAccess
{
    public class TestManager : ITestManager
    {
        private IUnitOfWork _unitOfWork;
        private ITestRepository _testRepository;

        public TestManager(IUnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
            _testRepository = _unitOfWork.GetRepository<TestRepository>();
        }
        
        public async Task<string> DoWork()
        {
            return await _testRepository.GetAsync();
        }

    }
}

示例回购 Link:

Class Link

Repo Link

视情况而定。你想测试什么?如果您需要模拟由 IUnitOfWork 构建的 ITestRepository,您可以使用 NSubstitute 执行以下操作:

public class SomeTestClass
{
    public void SomeTest()
    {
        var repository = Substitute.For<ITestRepository>();
        var unitOfWork = Substitute.For<IUnitOfWork>();
        unitOfWork.GetRepository<TestRepository>().Returns(repository);
    }
}

在那种情况下,您将同时模拟存储库和 uow,并使 uow return 成为模拟存储库。