1
我在我的控制器中有一个方法。单元测试一个方法,调用另一个返回null的方法,不管是什么
public JsonResult GetMemberSubgroupSpecifications(int rows, int page)
{
List<VersionSpecification> versionSpecifications = _sessionAccessor.Contract.VersionSpecifications
.Where(x => x.SpecificationType.Id == (int)SpecificationTypes.MemberSubGroup).ToList();
List<MemberSubGroup> subGroups = _sessionAccessor.MemberSubGroups;
if (subGroups == null)
{
subGroups = _subGroups.GetMemberSubGroups();
}
else if (subGroups.Count == 0)
{
subGroups = _subGroups.GetMemberSubGroups();
}
var specificationValues = versionSpecifications.GroupBy(x => x.Value).ToDictionary(r => r.Key, z => z.First());
List<MemberSubGroup> contractMemberSubGroups = subGroups.Where(x => specificationValues.ContainsKey(x.Id)).ToList();
_sessionAccessor.MemberSubGroups = contractMemberSubGroups;
var jsonData = contractMemberSubGroups.Select(x => new
{
Id = x.Id,
MemberSubGroupName = x.SubGroupName,
MemberGroupName = x.MemberGroup.GroupName,
MemberGroupId = x.MemberGroup.Id,
SubGroupCode = x.SubGroupCode,
StartDate = specificationValues[x.Id].StartDate,
EndDate = specificationValues[x.Id].EndDate
}).ToList();
var json = _jsonHelper.FormatContractDetailsJsonData(rows, page, jsonData);
return json;
当试图写该方法的单元测试,我不能让
_jsonHelper.FormatContractDetailsJsonData(rows, page, jsonData);
返回任何东西,但空。
这是我的单元测试的方法。
[Test]
public void GetMemberSubGroupsSpecifications_ReturnsJson()
{
//Arrange
var jsonHelper = MockRepository.GenerateMock<IJsonHelper>();
jsonHelper.Stub(x => x.FormatContractDetailsJsonData(Arg<int>.Is.Anything, Arg<int>.Is.Anything, Arg<List<object>>.Is.Anything)).Return(new JsonResult() { });
var specificationType = MockRepository.GenerateMock<SpecificationType>();
specificationType.Id = 2;
var versionSpecification = MockRepository.GenerateMock<VersionSpecification>();
versionSpecification.SpecificationType = specificationType;
versionSpecification.Value = 2;
var sessionAccessor = MockRepository.GenerateMock<ISessionAccessor>();
var memberGroup = MockRepository.GenerateMock<MemberGroup>();
memberGroup.GroupName = "groupName";
memberGroup.Id = 2;
var memberGroups = new List<MemberGroup>()
{
memberGroup
};
var contractVersion = MockRepository.GenerateMock<ContractVersion>();
contractVersion.VersionSpecifications = new List<VersionSpecification>()
{
versionSpecification
};
var memberSubGroup = MockRepository.GenerateMock<MemberSubGroup>();
memberSubGroup.Id = 2;
memberSubGroup.MemberGroup = memberGroup;
memberSubGroup.SubGroupCode = "subGroupCode";
var listMemberSubGroups = new List<MemberSubGroup>()
{
memberSubGroup
};
sessionAccessor.Stub(x => x.MemberGroups).Return(memberGroups);
sessionAccessor.Stub(x => x.Contract).Return(contractVersion);
sessionAccessor.Stub(x => x.MemberSubGroups).Return(listMemberSubGroups);
var searchController = ObjectFactory.GetSearchController(sessionAccessor, null, null, jsonHelper);
//Act
var actual = searchController.GetMemberSubgroupSpecifications(1, 1);
//Assert
Assert.IsNotNull(actual);
Assert.IsInstanceOf(typeof(JsonResult), actual);
}
我一直在为此奋斗了几天,我找不到任何能够帮助我进行任何搜索的东西。 此外,我还是比较新的一般使用rhino mock和单元测试。
这里是FormatContractDetailsToJson方法:
public JsonResult FormatContractDetailsJsonData<T>(int rows, int page, List<T> data)
{
var totalPages = (int)Math.Ceiling(data.Count/(float)rows);
JsonResult json = new JsonResult();
json.Data = new
{
total = totalPages,
page,
records = data.Count,
rows = data
};
json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
return json;
}
相信列表数据参数是为什么发生这种情况的原因,但我不知道。
那一个控制器方法在做太多事情。你应该分解它,以便你可以单独测试它们。这一方法是a)获得适当的组,b)获得适当的规范,c)将组+规范转换为一种类型(您可能想要取消匿名化),d)将新类型的列表转换为JSON。 – 48klocs
我完全同意。我们在最后一次冲刺中时间紧张,这是3个不同开发者努力确保故事通过的联合努力。我想把它分解出来,但我可能需要一个故事才能够投入所需的时间来真正清理该控制器。 – kkp91
我也不是100%确定你想要用你的测试完成什么 - 你只是验证你可以成功地模拟'IJsonHelper.FormatContractDetailsJsonData()'。您对调用的结果不感兴趣,您有兴趣验证调用是否已经完成,这是模拟对象为您提供的(如果您验证了断言)。 – 48klocs