[英]Arranging Unit Test using Moq
我創建了一個名為ListOfPeople
的方法,並嘗試為其編寫單元測試 。 目前,我在設置單元測試的“ Arrange
部分時遇到了麻煩。 我現在無法運行,因為我的PeopleId
和PersonGroupJobId
狀態Cannot resolve symbol
。
問題: 如何成功測試此方法?
我的方法:
public IEnumerable<Person> ListOfPeople(int personId, int? jobId)
{
var people = _unitOfWork.GetRepository<DB.Person>().GetAll()
.Where(p => p.PeopleGroups.Any(m => m.PeopleId == personId
&& m.PersonGroupdJobId == jobId));
if (!people.Any())
return new List<Person>();
var personData = people.Select(p => new Person
{
Id = p.PersonId,
Name = p.PersonName,
WorkTypeId = p.WorkTypeId,
PrimaryLanguage = p.PrimaryLanguage,
PeopleGroups = p.PeopleGroups.ToList()
.Select(pp => new PeopleGroup
{
Id = pp.ProjectPartyId,
PeopleId = pp.PeopleId,
JobId = pp.PersonGroupJobId ?? 0,
AddressId = pp.AddressId
})
}).ToList();
return personData;
}
單元測試:
[TestMethod]
public void ListOfPeople_peopleExist_returnsList()
{
// Arrange
var people = new List<DB.Person>
{
PeopleId = It.IsAny<int>(),
PersonGroupdJobId = It.IsAny<int>()
};
_uowMock
.Setup(mock => mock.GetRepository<DB.Person>().GetAll())
.Returns(people.AsQueryable());
// Act
var result = _repository.ListOfPeople(It.IsAny<int>(), It.IsAny<int>());
// Assert
Assert.IsNotNull(result);
Assert.AreEqual(2, result.Count());
_unitOfWork.Verify(mock => mock.Commit(), Times.Never());
_unitOfWork.Verify(mock => mock.GetRepository<DB.Person>().GetAll(), Times.Once());
}
您沒有正確初始化列表。 你需要:
var people = new List<DB.Person>
{
new DB.Person
{
PeopleId = It.IsAny<int>(),
PersonGroupdJobId = It.IsAny<int>()
}
};
您沒有正確使用Moq's
It
匹配器。 匹配器旨在用於Moq的“ Setup
和“ Verify
調用中(例如, 請參閱此處的示例用法)
It.IsAny
。 It.IsAny<>
將會發生的所有事情是將為這些值分配default(Type)
,即Ints等為零,這將無用。 var people = new List<DB.Person>
{
new DB.Person
{
PeopleId = 1234, // Some traceable value and NOT It.IsAny<int>(),
PersonGroupdJobId = 987,
...
It.IsAny<>
): var result = _repository.ListOfPeople(1234, 567); // Filters matching your test scenario
另外,由於要測試的方法至少涉及兩個方面,即對存儲庫應用過濾器,然后將數據庫實體映射到另一個POCO,因此您需要提供完整的輸入數據集,以便可以證明所有輸入字段映射到輸出字段。
如果將所有這些放在一起,則單元測試將類似於:
[Test]
public void ListOfPeople_peopleExist_returnsList()
{
// Arrange : Generate fake data
var people = new List<DB.Person>
{
new DB.Person
{
PersonId = 123,
PersonName = "Bob",
PrimaryLanguage = "French",
WorkTypeId = 987,
PeopleGroups = new []
{
new DB.PeopleGroup
{
AddressId = 123,
PersonGroupJobId = 999,
PeopleId = 123, // Match the parent ID
ProjectPartyId = 3
}
}
}
};
// Your _unitOfWork and _repository mocks seem to be class private fields
var _unitOfWork = new Mock<IUnitOfWork>();
_unitOfWork
.Setup(mock => mock.GetRepository<DB.Person>().GetAll())
.Returns(people.AsQueryable());
var _repository = new MyRepo(_unitOfWork.Object);
// Act
var result = _repository.ListOfPeople(123, 999);
// Assert
Assert.IsNotNull(result);
Assert.AreEqual(1, result.Count(r => r.Name == "Bob"
&& r.Id == 123
&& r.PeopleGroups.First().Id == 3));
//... etc - ensure all the fields are mapped
_unitOfWork.Verify(mock => mock.Commit(), Times.Never());
_unitOfWork.Verify(mock => mock.GetRepository<DB.Person>().GetAll(),
Times.Once());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.