2017-12-11 17 views
0

아무 것도 반환하지 않는 단위 테스트가 있으며 메서드 내 그룹 또는 계산으로 인해 목록이 0으로 유지되는 경우 궁금합니다. 올바른 방향으로 도움이나 조언을 주시면 감사하겠습니다. 고맙습니다!DateTime 차이 계산 그룹 내의 합계

단위 테스트 :

  #region CalculateTimeToPay_IntegerEmployeeIDAndDateTimeWeekOfDate_IQueryableTimeToPay 
    [TestMethod] 
    public void CalculateTimeToPay_IntegerEmployeeIDAndDateTimeWeekOfDate_IQueryableTimeToPay() 
    { 
     //Arrange 
     var service = new WWIncomeTaxDataHandlerService("ProdSQL"); 
     DateTime payrollWeekEnd = Convert.ToDateTime("2017-01-22"); 
     DateTime payrollWeekStart = Convert.ToDateTime("2017-01-16"); 

     var V_Times = new List<V_Time>() 
     { 
      new V_Time { PayTimeIn = Convert.ToDateTime("2017-01-05 08:00:00.000"), PayTimeOut = Convert.ToDateTime("2017-01-05 16:00:00.000"), EmployeeID = 999 }, 
      new V_Time { PayTimeIn = Convert.ToDateTime("2017-01-05 08:30:00.000"), PayTimeOut = Convert.ToDateTime("2017-01-05 16:00:00.000"), EmployeeID = 777 }, 
      new V_Time { PayTimeIn = Convert.ToDateTime("2017-01-05 08:45:00.000"), PayTimeOut = Convert.ToDateTime("2017-01-05 16:00:00.000"), EmployeeID = 888 }, 
      new V_Time { PayTimeIn = Convert.ToDateTime("2017-01-10 08:00:00.000"), PayTimeOut = Convert.ToDateTime("2017-01-10 16:00:00.000"), EmployeeID = 999 }, 
      new V_Time { PayTimeIn = Convert.ToDateTime("2017-01-10 08:30:00.000"), PayTimeOut = Convert.ToDateTime("2017-01-10 16:00:00.000"), EmployeeID = 777 }, 
      new V_Time { PayTimeIn = Convert.ToDateTime("2017-01-10 08:45:00.000"), PayTimeOut = Convert.ToDateTime("2017-01-10 16:00:00.000"), EmployeeID = 888 }, 
      new V_Time { PayTimeIn = Convert.ToDateTime("2017-01-11 08:00:00.000"), PayTimeOut = Convert.ToDateTime("2017-01-11 16:00:00.000"), EmployeeID = 999 }, 
      new V_Time { PayTimeIn = Convert.ToDateTime("2017-01-11 00:00:00.000"), PayTimeOut = Convert.ToDateTime("2017-01-11 07:00:00.000"), EmployeeID = 777 }, 
      new V_Time { PayTimeIn = Convert.ToDateTime("2017-01-11 08:00:00.000"), PayTimeOut = Convert.ToDateTime("2017-01-11 16:00:00.000"), EmployeeID = 888 }, 
      new V_Time { PayTimeIn = Convert.ToDateTime("2017-01-12 08:00:00.000"), PayTimeOut = Convert.ToDateTime("2017-01-12 16:00:00.000"), EmployeeID = 999 }, 
      new V_Time { PayTimeIn = Convert.ToDateTime("2017-01-12 08:00:00.000"), PayTimeOut = Convert.ToDateTime("2017-01-12 16:44:00.000"), EmployeeID = 777 }, 
      new V_Time { PayTimeIn = Convert.ToDateTime("2017-01-12 08:00:00.000"), PayTimeOut = Convert.ToDateTime("2017-01-12 16:00:00.000"), EmployeeID = 888 }, 
      new V_Time { PayTimeIn = Convert.ToDateTime("2017-01-14 08:00:00.000"), PayTimeOut = Convert.ToDateTime("2017-01-14 16:07:00.000"), EmployeeID = 777 } 
     }; 

     var mockRepository = new Mock<IRepository>(); 
     mockRepository.Setup(x => x.Find<V_Time>()).Returns(V_Times.AsQueryable()); 
     var builder = BuildContainer(); 
     builder.Register(x => mockRepository.Object).As<IRepository>(); 
     var container = builder.Build(); 

     var itrs = container.Resolve<WWIncomeTaxDataHandler.Domain.WWIncomeTaxDataHandlerService>(); 

     var expected = new List<calculatedHours>() 
     { 
      new calculatedHours { EmployeeID = 999, TimeToPay = 24 }, 
      new calculatedHours { EmployeeID = 888, TimeToPay = 31.35}, 
      new calculatedHours { EmployeeID = 777, TimeToPay = 23.25} 
     }; 

     //Act 
     var actual = itrs.CalculateTimeToPay(payrollWeekStart, payrollWeekEnd); 

     //Assert 
     var compareLogic = new CompareLogic(); 
     var result = compareLogic.Compare(actual, expected); 
     Assert.IsTrue(result.AreEqual, result.DifferencesString); 
    } 
    #endregion 

방법 : 다시 쿼리 가능에 tolist 및 빠른 테스트를했다

  #region CalculateTimeToPay(payrollWeekEnd) 
    public IQueryable CalculateTimeToPay(DateTime payrollWeekStart, DateTime payrollWeekEnd) 
    { 
     var uow = container.Resolve<WWIncomeTaxDataHandlerUnitOfWork>(); 

     var employeeHours = (from time in uow.Accounting.Repository.Find<V_Time>() 
          where (payrollWeekEnd >= time.PayTimeIn && time.PayTimeIn >= payrollWeekStart) 
          group time by new { time.EmployeeID } into empGroup 
          select new calculatedHours 
          { 
           EmployeeID = empGroup.Key.EmployeeID, 
           TimeToPay = empGroup.Where(x => x.EmployeeID == empGroup.Key.EmployeeID).Sum (x => ((x.PayTimeOut - x.PayTimeIn).TotalSeconds)/60/60) 
          }).ToList(); 


     return employeeHours.AsQueryable(); 
    } 
    #endregion 

참고

답변

0

당신은 무리와 함께 매우 복잡하고있는 익명 데이터 유형 중. 당신은 그것을 조금 더 시도 할 수 있습니다. C# 스타일 :

public class CalculatedHours 
{ 
    public int EmployeeId { get; set; } 
    public TimeSpan TimeToPay { get; set; } 
} 

public class PayTime 
{ 
    public DateTime PayTimeIn { get; set; } 
    public DateTime PayTimeOut { get; set; } 
    public int EmployeeId { get; set; } 

    public TimeSpan CalculateTimeToPay(DateTime payrollWeekStart, DateTime payrollWeekEnd) 
    { 
     DateTime realIn = payrollWeekStart > this.PayTimeIn ? payrollWeekStart : this.PayTimeIn; 
     DateTime realOut = payrollWeekEnd < this.PayTimeOut ? payrollWeekEnd : this.PayTimeOut; 

     return realOut - realIn; 
    } 

    public static void Test() 
    { 
     List<PayTime> someData = new List<PayTime>() { }; 

     DateTime payrollWeekEnd = Convert.ToDateTime("2017-01-22"); 
     DateTime payrollWeekStart = Convert.ToDateTime("2017-01-16"); 

     IEnumerable<CalculatedHours> result = someData.GroupBy(g => g.EmployeeId) 
      .Select(s => new CalculatedHours() { EmployeeId = s.Key, TimeToPay = new TimeSpan(s.Sum(a => a.CalculateTimeToPay(payrollWeekStart, payrollWeekEnd).Ticks)) }); 
     // Do some assertions 
    } 
} 

Btw. 귀하의 Testdata가 잘못되었습니다. payrollWeekStartpayrollWeekEnd이 너무 늦었습니다 (2017-01-16 ~ 2017-01-22 데이터는 최대 2017-01-14). Additionaly 당신은 아르바이트 지불을 계산하지 않습니다 ..

+0

나는 지금 바보 같은 느낌. 그것은 내가 사용하고있는 시간 틀이었고, 예상 한 것을 바꾼 후에 꺼져 있다는 것을 깨닫지 못했습니다. 도와 주셔서 감사합니다 :) –