C# 有人能给我看一下我';我尝试调用工作单元测试控制器时出错了?

C# 有人能给我看一下我';我尝试调用工作单元测试控制器时出错了?,c#,unit-testing,C#,Unit Testing,我似乎无法理解这一点,我有一个C#MVC web应用程序,它使用实体框架,具有通用存储库和工作单元 我正在尝试测试一个控制器方法,该方法使用工作单元来获取人员列表,但我似乎无法正确地模拟它!我得到的错误是: System.ArgumentNullException: Value cannot be null. Parameter name: source 我会尽可能地简化它,但是如果你想让我发布更多的代码,我可以这样做。因此,我的代码如下: 控制器 IQueryable<PERSON&g

我似乎无法理解这一点,我有一个C#MVC web应用程序,它使用实体框架,具有通用存储库和工作单元

我正在尝试测试一个控制器方法,该方法使用工作单元来获取人员列表,但我似乎无法正确地模拟它!我得到的错误是:

System.ArgumentNullException: Value cannot be null.
Parameter name: source
我会尽可能地简化它,但是如果你想让我发布更多的代码,我可以这样做。因此,我的代码如下:

控制器

IQueryable<PERSON> people = unitOfWork.PersonRepository.GetAll();
var persontest = people.ToList();
public class HomeControllerTest
{
    private Mock<IUnitOfWork> _unitOfWorkMock;
    private HomeController _objController;
    private Mock<IRepository<PERSON>> _personRepository;

    [TestInitialize]
    public void Initialize()
    {
        _unitOfWorkMock = new Mock<IUnitOfWork>();
        _objController = new HomeController(_unitOfWorkMock.Object);
        _personRepository = new Mock<IRepository<PERSON>>();
        _personRepository.Setup(x => x.GetAll()).Returns(GetPersonList() as IQueryable<PERSON>).Verifiable();
    }

    [TestMethod]
    public void Index()
    {
        // Arrange
        _unitOfWorkMock.Setup(x => x.PersonRepository).Returns(_personRepository.Object);
        var viewModel = CreateIndexViewModelNoSearchParams();
        viewModel.SearchViewModel.Casenote = "CASENOTE1";

        // Act
        ViewResult result = _objController.Index(viewModel) as ViewResult;

        // Assert
        Assert.IsNotNull(result);
        Assert.AreEqual(1, viewModel.PersonViewModel.Count);
        Assert.AreEqual(2, viewModel.PersonViewModel[0].CasenoteList.Count);
        Assert.AreEqual("Index", result.ViewName);
    }

    #region Setup Methods

    private IndexViewModel CreateIndexViewModelNoSearchParams()
    {
        var viewModel = new IndexViewModel
        {
            SearchViewModel = new SearchViewModel
            {
                Hcn = null,
                Forename = null,
                Surname = null,
                Dob = null,
                Casenote = null
            }
        };
        return viewModel;
    }

    private List<PERSON> GetPersonList()
    {
        return new List<PERSON>
        {
            new PERSON
            {
                PAS_INT_NO = 1,
                SURNAME = "TEST SURNAME 1",
                FORENAMES = "TEST FORENAMES 1",
                DOB = new DateTime(2001,01,30),
                SEX = "M",
                GP_CODE = "TEST1",
                ADDRESS1 = "TEST ADDRESS1",
                ADDRESS2 = "TEST ADDRESS2",
                ADDRESS3 = "TEST ADDRESS3",
                ADDRESS4 = "TEST ADDRESS4",
                POSTCODE = "TESTPC1",
                CSA_NO = "1234567890",
                DEAD = "N",
                DATE_OF_DEATH = null,
                TITLE = "MR",
                DHA_CODE = "ABC",
                TELEPHONE = "1234567890",
                PREV_SURNAME_1 = null,
                PREV_SURNAME_2 = null,
                PREV_SURNAME_3 = null,
                MRSA_STATUS = null,
                MRSA_DATE = null
            },
            new PERSON
            {
                PAS_INT_NO = 2,
                SURNAME = "TEST SURNAME 2",
                FORENAMES = "TEST FORENAMES 2",
                DOB = new DateTime(2001,01,30),
                SEX = "M",
                GP_CODE = "TEST2",
                ADDRESS1 = "TEST ADDRESS1",
                ADDRESS2 = "TEST ADDRESS2",
                ADDRESS3 = "TEST ADDRESS3",
                ADDRESS4 = "TEST ADDRESS4",
                POSTCODE = "TESTPC2",
                CSA_NO = "1234567890",
                DEAD = "N",
                DATE_OF_DEATH = null,
                TITLE = "MR",
                DHA_CODE = "ABC",
                TELEPHONE = "1234567890",
                PREV_SURNAME_1 = null,
                PREV_SURNAME_2 = null,
                PREV_SURNAME_3 = null,
                MRSA_STATUS = null,
                MRSA_DATE = null
            },
            new PERSON
            {
                PAS_INT_NO = 3,
                SURNAME = "TEST SURNAME 3",
                FORENAMES = "TEST FORENAMES 3",
                DOB = new DateTime(2001,01,30),
                SEX = "M",
                GP_CODE = "TEST3",
                ADDRESS1 = "TEST ADDRESS1",
                ADDRESS2 = "TEST ADDRESS2",
                ADDRESS3 = "TEST ADDRESS3",
                ADDRESS4 = "TEST ADDRESS4",
                POSTCODE = "TESTPC3",
                CSA_NO = "1234567890",
                DEAD = "N",
                DATE_OF_DEATH = null,
                TITLE = "MR",
                DHA_CODE = "ABC",
                TELEPHONE = "1234567890",
                PREV_SURNAME_1 = null,
                PREV_SURNAME_2 = null,
                PREV_SURNAME_3 = null,
                MRSA_STATUS = null,
                MRSA_DATE = null
            },
            new PERSON
            {
                PAS_INT_NO = 4,
                SURNAME = "TEST SURNAME 4",
                FORENAMES = "TEST FORENAMES 4",
                DOB = new DateTime(2001,01,30),
                SEX = "M",
                GP_CODE = "TEST4",
                ADDRESS1 = "TEST ADDRESS1",
                ADDRESS2 = "TEST ADDRESS2",
                ADDRESS3 = "TEST ADDRESS3",
                ADDRESS4 = "TEST ADDRESS4",
                POSTCODE = "TESTPC4",
                CSA_NO = "1234567890",
                DEAD = "N",
                DATE_OF_DEATH = null,
                TITLE = "MR",
                DHA_CODE = "ABC",
                TELEPHONE = "1234567890",
                PREV_SURNAME_1 = null,
                PREV_SURNAME_2 = null,
                PREV_SURNAME_3 = null,
                MRSA_STATUS = null,
                MRSA_DATE = null
            }
        };
    }
    #endregion  
}
IQueryable-people=unitOfWork.PersonRepository.GetAll();
var persontest=people.ToList();
此方法还有更多内容,但它在ToList()上失败。实际的代码要复杂得多,在调用ToList()之前,IQueryable中添加了很多

工作单元

public class UnitOfWork : IUnitOfWork, IDisposable
{
    private DBContext context = new PASICSDBContextqlEntities();
    private IRepository<PERSON> personRepository;

    public IRepository<PERSON> PersonRepository
    {
        get
        {
            if (personRepository == null)
            {
                personRepository = new Repository<PERSON>(context);
            }
            return personRepository;
        }
    }

    public void Save()
    {
        context.SaveChanges();
    }

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                context.Dispose();
            }
        }
        disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}
公共类UnitOfWork:IUnitOfWork,IDisposable
{
private DBContext context=new PASICSDBContextqlEntities();
个人信息存储库;
公共IRepository PersonRepository
{
得到
{
if(personRepository==null)
{
personRepository=新存储库(上下文);
}
返回personRepository;
}
}
公共作废保存()
{
SaveChanges();
}
私有布尔=假;
受保护的虚拟void Dispose(bool disposing)
{
如果(!已处置)
{
如果(处置)
{
context.Dispose();
}
}
这是真的;
}
公共空间处置()
{
处置(真实);
总干事(本);
}
}
存储库

public class Repository <TEntity> : IRepository <TEntity> where TEntity: class
{
    internal PASICSqlEntities context;
    internal DbSet<TEntity> dbSet;

    public Repository(PASICSqlEntities context)
    {
        this.context = context;
        dbSet = context.Set<TEntity>();
    }

    public virtual IEnumerable<TEntity> Get(
        Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
        string includeProperties = "")
    {
        IQueryable<TEntity> query = dbSet;

        if (filter != null)
        {
            query = query.Where(filter);
        }

        foreach (var includeProperty in includeProperties.Split
            (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
        {
            query = query.Include(includeProperty);
        }

        if (orderBy != null)
        {
            return orderBy(query).ToList();
        }
        else
        {
            return query.ToList();
        }
    }

    public virtual IQueryable<TEntity> GetAll()
    {
        return dbSet.AsQueryable();
    }

    public virtual TEntity GetByID(object id)
    {
        return dbSet.Find(id);
    }

    public virtual void Insert(TEntity entity)
    {
        dbSet.Add(entity);
    }

    public virtual void Delete(object id)
    {
        TEntity entityToDelete = dbSet.Find(id);
        Delete(entityToDelete);
    }

    public virtual void Delete(TEntity entityToDelete)
    {
        if (context.Entry(entityToDelete).State == EntityState.Detached)
        {
            dbSet.Attach(entityToDelete);
        }
        dbSet.Remove(entityToDelete);
    }

    public virtual void Update(TEntity entityToUpdate)
    {
        dbSet.Attach(entityToUpdate);
        context.Entry(entityToUpdate).State = EntityState.Modified;
    }

    public void ExecuteRawSql(string query, params object[] parameters)
    {
        dbSet.SqlQuery(query, parameters);
    }
}
公共类存储库:i存储,其中tenty:class
{
内部PASICSqlEntities上下文;
内部数据库集;
公共存储库(PASICSqlEntities上下文)
{
this.context=上下文;
dbSet=context.Set();
}
公共虚拟IEnumerable Get(
表达式筛选器=空,
Func orderBy=null,
字符串includeProperties=“”)
{
IQueryable query=dbSet;
if(过滤器!=null)
{
query=query.Where(过滤器);
}
foreach(includeProperty.Split中的var includeProperty
(新字符[]{',},StringSplitOptions.RemoveEmptyEntries)
{
query=query.Include(includeProperty);
}
if(orderBy!=null)
{
returnorderby(query.ToList();
}
其他的
{
返回query.ToList();
}
}
公共虚拟IQueryable GetAll()
{
返回dbSet.AsQueryable();
}
公共虚拟实体GetByID(对象id)
{
返回dbSet.Find(id);
}
公共虚拟空白插入(TEntity实体)
{
添加(实体);
}
公共虚拟无效删除(对象id)
{
TEntity entityToDelete=dbSet.Find(id);
删除(entityToDelete);
}
公共虚拟无效删除(TEntity entityToDelete)
{
if(context.Entry(entityToDelete.State==EntityState.Detached)
{
数据库集连接(entityToDelete);
}
dbSet.Remove(entityToDelete);
}
公共虚拟无效更新(TEntity entityToUpdate)
{
数据库集附加(实体更新);
context.Entry(entityToUpdate.State=EntityState.Modified;
}
public void ExecuteRawSql(字符串查询,参数对象[]参数)
{
SqlQuery(查询,参数);
}
}
TestController

IQueryable<PERSON> people = unitOfWork.PersonRepository.GetAll();
var persontest = people.ToList();
public class HomeControllerTest
{
    private Mock<IUnitOfWork> _unitOfWorkMock;
    private HomeController _objController;
    private Mock<IRepository<PERSON>> _personRepository;

    [TestInitialize]
    public void Initialize()
    {
        _unitOfWorkMock = new Mock<IUnitOfWork>();
        _objController = new HomeController(_unitOfWorkMock.Object);
        _personRepository = new Mock<IRepository<PERSON>>();
        _personRepository.Setup(x => x.GetAll()).Returns(GetPersonList() as IQueryable<PERSON>).Verifiable();
    }

    [TestMethod]
    public void Index()
    {
        // Arrange
        _unitOfWorkMock.Setup(x => x.PersonRepository).Returns(_personRepository.Object);
        var viewModel = CreateIndexViewModelNoSearchParams();
        viewModel.SearchViewModel.Casenote = "CASENOTE1";

        // Act
        ViewResult result = _objController.Index(viewModel) as ViewResult;

        // Assert
        Assert.IsNotNull(result);
        Assert.AreEqual(1, viewModel.PersonViewModel.Count);
        Assert.AreEqual(2, viewModel.PersonViewModel[0].CasenoteList.Count);
        Assert.AreEqual("Index", result.ViewName);
    }

    #region Setup Methods

    private IndexViewModel CreateIndexViewModelNoSearchParams()
    {
        var viewModel = new IndexViewModel
        {
            SearchViewModel = new SearchViewModel
            {
                Hcn = null,
                Forename = null,
                Surname = null,
                Dob = null,
                Casenote = null
            }
        };
        return viewModel;
    }

    private List<PERSON> GetPersonList()
    {
        return new List<PERSON>
        {
            new PERSON
            {
                PAS_INT_NO = 1,
                SURNAME = "TEST SURNAME 1",
                FORENAMES = "TEST FORENAMES 1",
                DOB = new DateTime(2001,01,30),
                SEX = "M",
                GP_CODE = "TEST1",
                ADDRESS1 = "TEST ADDRESS1",
                ADDRESS2 = "TEST ADDRESS2",
                ADDRESS3 = "TEST ADDRESS3",
                ADDRESS4 = "TEST ADDRESS4",
                POSTCODE = "TESTPC1",
                CSA_NO = "1234567890",
                DEAD = "N",
                DATE_OF_DEATH = null,
                TITLE = "MR",
                DHA_CODE = "ABC",
                TELEPHONE = "1234567890",
                PREV_SURNAME_1 = null,
                PREV_SURNAME_2 = null,
                PREV_SURNAME_3 = null,
                MRSA_STATUS = null,
                MRSA_DATE = null
            },
            new PERSON
            {
                PAS_INT_NO = 2,
                SURNAME = "TEST SURNAME 2",
                FORENAMES = "TEST FORENAMES 2",
                DOB = new DateTime(2001,01,30),
                SEX = "M",
                GP_CODE = "TEST2",
                ADDRESS1 = "TEST ADDRESS1",
                ADDRESS2 = "TEST ADDRESS2",
                ADDRESS3 = "TEST ADDRESS3",
                ADDRESS4 = "TEST ADDRESS4",
                POSTCODE = "TESTPC2",
                CSA_NO = "1234567890",
                DEAD = "N",
                DATE_OF_DEATH = null,
                TITLE = "MR",
                DHA_CODE = "ABC",
                TELEPHONE = "1234567890",
                PREV_SURNAME_1 = null,
                PREV_SURNAME_2 = null,
                PREV_SURNAME_3 = null,
                MRSA_STATUS = null,
                MRSA_DATE = null
            },
            new PERSON
            {
                PAS_INT_NO = 3,
                SURNAME = "TEST SURNAME 3",
                FORENAMES = "TEST FORENAMES 3",
                DOB = new DateTime(2001,01,30),
                SEX = "M",
                GP_CODE = "TEST3",
                ADDRESS1 = "TEST ADDRESS1",
                ADDRESS2 = "TEST ADDRESS2",
                ADDRESS3 = "TEST ADDRESS3",
                ADDRESS4 = "TEST ADDRESS4",
                POSTCODE = "TESTPC3",
                CSA_NO = "1234567890",
                DEAD = "N",
                DATE_OF_DEATH = null,
                TITLE = "MR",
                DHA_CODE = "ABC",
                TELEPHONE = "1234567890",
                PREV_SURNAME_1 = null,
                PREV_SURNAME_2 = null,
                PREV_SURNAME_3 = null,
                MRSA_STATUS = null,
                MRSA_DATE = null
            },
            new PERSON
            {
                PAS_INT_NO = 4,
                SURNAME = "TEST SURNAME 4",
                FORENAMES = "TEST FORENAMES 4",
                DOB = new DateTime(2001,01,30),
                SEX = "M",
                GP_CODE = "TEST4",
                ADDRESS1 = "TEST ADDRESS1",
                ADDRESS2 = "TEST ADDRESS2",
                ADDRESS3 = "TEST ADDRESS3",
                ADDRESS4 = "TEST ADDRESS4",
                POSTCODE = "TESTPC4",
                CSA_NO = "1234567890",
                DEAD = "N",
                DATE_OF_DEATH = null,
                TITLE = "MR",
                DHA_CODE = "ABC",
                TELEPHONE = "1234567890",
                PREV_SURNAME_1 = null,
                PREV_SURNAME_2 = null,
                PREV_SURNAME_3 = null,
                MRSA_STATUS = null,
                MRSA_DATE = null
            }
        };
    }
    #endregion  
}
公共类HomeControllerTest
{
私人模拟(unitOfWorkMock),;
私人家庭控制器(objController),;
私有模拟人存储库;
[测试初始化]
公共无效初始化()
{
_unitOfWorkMock=新建Mock();
_objController=新的HomeController(_unitOfWorkMock.Object);
_personRepository=newmock();
_Setup(x=>x.GetAll())。返回(GetPersonList()作为IQueryable.Verifiable();
}
[测试方法]
公共空间索引()
{
//安排
_unitOfWorkMock.Setup(x=>x.PersonRepository).Returns(\u PersonRepository.Object);
var viewModel=CreateIndexViewModelNoSearchParams();
viewModel.SearchViewModel.Casenote=“CASENOTE1”;
//表演
ViewResult结果=_objController.Index(viewModel)作为ViewResult;
//断言
Assert.IsNotNull(结果);
AreEqual(1,viewModel.PersonViewModel.Count);
Assert.AreEqual(2,viewModel.PersonViewModel[0].CasenoteList.Count);
Assert.AreEqual(“Index”,result.ViewName);
}
#区域设置方法
私有IndexViewModel CreateIndexViewModelNoSearchParams()
{
var viewModel=新索引模型
{
SearchViewModel=新的SearchViewModel
{
Hcn=null,
Forename=null,
姓氏=空,
Dob=null,
Casenote=null
}
};
返回视图模型;
}
私有列表GetPersonList()
{
返回新列表
{
新人
{
PAS_INT_NO=1,
姓氏=“测试姓氏1”,
FORENAMES=“TEST FORENAMES 1”,
DOB=新日期时间(2001,01,30),
SEX=“M”,
GP_CODE=“TEST1”,
ADDRESS1=“测试地址1”,
ADDRESS2=“测试地址2”,
ADDRESS3=“测试地址3”,
ADDRESS4=“测试地址4”,
POSTCODE=“TESTPC1”,
CSA_NO=“1234567890”,
DEAD=“N”,
死亡日期=空,
TITLE=“MR”,
DHA_CODE=“ABC”,
电话=“1234567890”,
PREV_姓氏_1=null,