如何使用工作单元和存储库模式来添加简单的添加功能 [英] how to moq simple add function that uses Unit of Work and Repository Pattern

查看:121
本文介绍了如何使用工作单元和存储库模式来添加简单的添加功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的测试看起来像这样

        [Fact]
    public void SimpleAddTest()
    {
        // Arrange
        var authorizationsToBeAdded = new List<PatientPayerAuthInfo>
        {
            new PatientPayerAuthInfo (),
            new PatientPayerAuthInfo  ()
        }.ToList();
        var persistentAuthorizations = new List<PatientPayerAuthInfo>
        {
            new PatientPayerAuthInfo {PatientPayerAuthInfoId = 1 },
            new PatientPayerAuthInfo  {PatientPayerAuthInfoId = 2 },
             new PatientPayerAuthInfo  {PatientPayerAuthInfoId = 3 },
             new PatientPayerAuthInfo  {PatientPayerAuthInfoId = 4 }
        }.AsQueryable();

        var mockSet = new Mock<DbSet<PatientPayerAuthInfo>>();
        mockSet.As<IQueryable<PatientPayerAuthInfo>>().Setup(m => m.Provider).Returns(persistentAuthorizations.Provider);
        mockSet.As<IQueryable<PatientPayerAuthInfo>>().Setup(m => m.Expression).Returns(persistentAuthorizations.Expression);
        mockSet.As<IQueryable<PatientPayerAuthInfo>>().Setup(m => m.ElementType).Returns(persistentAuthorizations.ElementType);
        mockSet.As<IQueryable<PatientPayerAuthInfo>>().Setup(m => m.GetEnumerator()).Returns(persistentAuthorizations.GetEnumerator());

        var mockedUnitOfWork = new Mock<IUOW<DBContext>>();     

        var service = new PatientPayerService(mockedUnitOfWork.Object);

        // Act
        var sut = service.AddPatientPayerAuthInfos(authorizationsToBeAdded);

        // Assert

    }

服务层功能如下

        public void AddPatientPayerAuthInfos(IEnumerable<PatientPayerAuthInfo> patientPayerAuthInfos)
    {
        foreach (var patientPayerAuthInfo in patientPayerAuthInfos)
        {
            UOW.PatientPayerAuthInfos.Add(patientPayerAuthInfo);
        }
        UOW.SaveChanges();
    }

AND存储库实现为

     public virtual void Add(T entity)
    {
        DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
        if (dbEntityEntry.State != EntityState.Detached)
        {
            dbEntityEntry.State = EntityState.Added;
        }
        else
        {
            DbSet.Add(entity);
        }
    }

然后有一个提交方法,该方法调用EF的SaveChanges.

which then has a commit method that calls EF's SaveChanges.

我的问题是我们如何使用persistentAuthorizations来设置mockedUnitOfWork,以便当我使用authorizationsToBeAdded添加两个对象时,persistentAuthorizations的总数将变为6,最初为4.

my question is how we can Setup mockedUnitOfWork using persistentAuthorizations so that when i add Two objects using authorizationsToBeAdded then the total count of persistentAuthorizations becomes 6, which are 4 initially.

或者纠正我,如果我走错了路.

or correct me if i am on wrong track.

  public interface IRepository<T> where T : class
  {
    void Add(T entity);
   }

public interface IUOW<U> where U : DbContext, IDisposable
{        
    IRepository<PatientPayerAuthInfo> PatientPayerAuthInfos { get; }
    void SaveChanges();
}

推荐答案

使用列表作为persistentAuthorizations的基础,例如:

Use a list as base for persistentAuthorizations like:

var data = new List<PatientPayerAuthInfo>
{
    new PatientPayerAuthInfo {PatientPayerAuthInfoId = 1 },
    new PatientPayerAuthInfo {PatientPayerAuthInfoId = 2 },
    new PatientPayerAuthInfo {PatientPayerAuthInfoId = 3 },
    new PatientPayerAuthInfo {PatientPayerAuthInfoId = 4 }
};
var persistentAuthorizations = data.AsQueryable();

然后您可以像这样设置mockedUnitOfWork:

Then you can setup mockedUnitOfWork like this:

var repositoy = new Mock<IRepository<PatientPayerAuthInfo>>();

// when adding data to the repository, add the item to 'data' 
repositoy.Setup(r => r.Add(It.IsAny<PatientPayerAuthInfo>()))
         .Callback(delegate(PatientPayerAuthInfo y)
                   {
                        data.Add(y);
                   });

// when accessing 'PatientPayerAuthInfos', use the repository mock
var mockedUnitOfWork = new Mock<IUOW<DBContext>>();
mockedUnitOfWork.SetupGet(x => x.PatientPayerAuthInfos).Returns(() => repositoy.Object);

这篇关于如何使用工作单元和存储库模式来添加简单的添加功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆