【发布时间】:2015-10-04 15:26:57
【问题描述】:
我创建了一个名为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());
}
【问题讨论】:
-
就像@David Arno 所说,您必须创建一个新的
DB.Person并在此人上初始化PeopleId和PersonGroupJobId。除此之外,我会考虑你的方法的命名。ListOfPeople是个好名字吗?或者GetPersonWithId(...)旁边的东西会更好吗?如果我阅读ListOfPerson,我会认为它是一个属性IList<Person> ListOfPeople { get; set; } -
你为什么要把人列表的
PeopleId等和It.IsAny<int>()排列在一起?给他们一些真实的数字。在行为中,您已经说过.ListOfPeople()将任何 int 作为输入 -
@xeraphim 好点。感谢您提供有关命名的提示,我将对其进行更改,使其更具描述性。
标签: c# asp.net unit-testing moq