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