2014-07-21 52 views
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; 
    } 

相信列表数据参数是为什么发生这种情况的原因,但我不知道。

+1

那一个控制器方法在做太多事情。你应该分解它,以便你可以单独测试它们。这一方法是a)获得适当的组,b)获得适当的规范,c)将组+规范转换为一种类型(您可能想要取消匿名化),d)将新类型的列表转换为JSON。 – 48klocs

+0

我完全同意。我们在最后一次冲刺中时间紧张,这是3个不同开发者努力确保故事通过的联合努力。我想把它分解出来,但我可能需要一个故事才能够投入所需的时间来真正清理该控制器。 – kkp91

+0

我也不是100%确定你想要用你的测试完成什么 - 你只是验证你可以成功地模拟'IJsonHelper.FormatContractDetailsJsonData()'。您对调用的结果不感兴趣,您有兴趣验证调用是否已经完成,这是模拟对象为您提供的(如果您验证了断言)。 – 48klocs

回答

0

你有不匹配的类型在你的设置代码:

jsonHelper.Stub(x => x.FormatContractDetailsJsonData(
     Arg<int>.Is.Anything, 
     Arg<int>.Is.Anything, 
     Arg<List<object>>.Is.Anything)) 
    .Return(new JsonResult() { }); 

在您的测试代码第三个参数不会是对象的列表 - 这将是对生成您是不是匿名类型实例编译器的列表做任何设置。

换句话说,你的测试使安装到:

FormatContractDetailsJsonData<object> 

当你实现调用或多或少:

FormatContractDetailsJsonData<<>f_AnonymousType...> 

然而有一个黑客。

var dummyList = Enumerable 
    .Range(0, 1) 
    .Select(x => new 
    { 
     Id = 1, 
     MemberSubGroupName = "", 
     MemberGroupName = "", 
     MemberGroupId = 1, 
     SubGroupCode = "", 
     StartDate = DateTime.Now, 
     EndDate = DateTime.Now, 
    }) 
    .ToList(); 

并设置:如果您的测试住在同一个组件的测试代码,你可以通过简单地声明另一个匿名类型与性质具有相同名称,类型和顺序产生这种类型的虚拟你的模拟像这样:

jsonHelper.Stub(x => x.FormatContractDetailsJsonData(1, 1, dummyList)) 
    .IgnoreArguments() 
    .Return(new JsonResult() { }); 

不幸的是,如果不是这样的情况(匿名类型从相同的组件发起),你很可能需要创建单独类型jsonData,使您的工作匹配。

相关问题