我正试图单独测试一个没有快乐的webapi项目。
api使用EF6.1访问数据。我的测试项目是使用moq和xunit。
我已经设置了基本测试,如
[Fact]
public void CheckGroupedDataCountEquals2()
{
var mockData = new List<Skill>()
{
new Skill() {Id = 1, Name = ".net"},
new Skill() {Id = 2, Name = "asp.net", ParentId = 1},
new Skill() {Id = 3, Name = "c#", ParentId = 1},
new Skill() {Id = 4, Name = "php"},
new Skill() {Id = 5, Name = "zend", ParentId = 4},
new Skill() {Id = 6, Name = "zend3", ParentId = 5}
};
// Arrange
_skillMock.Setup(x => x.GroupedSkills())
.Returns((new List<GroupedSkill>()));
var controller = new SkillsController(_skillMock.Object);
// Act
IHttpActionResult actionResult = controller.Get();
var contentResult = actionResult as OkNegotiatedContentResult<List<GroupedSkill>>;
// Assert
Assert.NotNull(contentResult);
var result = contentResult.Content as List<GroupedSkill>;
Assert.Equal(2,result.Count);
}
我的apicontroller动作看起来像
[HttpGet]
[Route("")]
// GET api/<controller>
public IHttpActionResult Get()
{
var data = _skillRepository.GroupedSkills();
if (data!=null)
{
return Ok(data);
}
return NotFound();
}
最后......我的回购
public List<GroupedSkill> GroupedSkills()
{
using (var context = new DataContext())
{
var data = context.Skills.ToList();
var newList = data.Where(x => x.ParentId != null).ToList().GroupBy(x => x.ParentId,
(key, elements) =>
new
{
data.First(i => i.Id == key).Name,
GroupId = key,
Skills = elements.ToList()
})
.ToList();
var filtered = new List<GroupedSkill>();
foreach (var item in newList)
{
filtered.Add(new GroupedSkill()
{
GroupId = item.GroupId.Value,
Name = item.Name,
Skills = item.Skills
});
}
return filtered;
}
}
我的测试总是失败,组计数始终为0.我认为它是因为我没有添加我的mockData模拟列表,而我的存储库对此一无所知.....我是对的吗?如何将我的模拟数据列表传递给我的测试中的repo
答案 0 :(得分:0)
你是对的,你把它传给了一个空列表。
首先创建mockedData
列表,然后使用真实Skills
填充它,但它看起来并不像你曾经使用它。 这也应该被视为安排部分的一部分,这是值得的。
var mockData = new List<Skill>()
{
new Skill() {Id = 1, Name = ".net"},
new Skill() {Id = 2, Name = "asp.net", ParentId = 1},
new Skill() {Id = 3, Name = "c#", ParentId = 1},
new Skill() {Id = 4, Name = "php"},
new Skill() {Id = 5, Name = "zend", ParentId = 4},
new Skill() {Id = 6, Name = "zend3", ParentId = 5}
};
然后当您通过创建_skillMock开始编辑部分,但是创建一个新的空列表时。
// Arrange
_skillMock.Setup(x => x.GroupedSkills())
.Returns((new List<GroupedSkill>()));
我无法分辨_skillMock的初始化位置;你不应该需要它(并且实际上不希望它)是一个类实例变量,因为它可能会在其他测试中发生变化。相反,您应该将此列表设置为类似于构建mockData列表的方式。
您正在此行中正确传递模拟对象:
var controller = new SkillsController(_skillMock.Object);
但是,由于您尚未向该列表添加任何内容,因此列表将始终为空。
理想情况下,我认为你想要的是一个真实的列表,其中包含你GroupedSkill
个对象的模拟,如下所示:
var mockData = new List<GroupedSkill>()
{
new Mock<GroupedSkill>(1, ".net").Object,
new Mock<GroupedSkill>(2, "asp.net", 1).Object,
// ... keep going
}
然后将该列表传递给您的控制器。