C# Pay=24}, 新计算小时数{EmployeeID=777,TimeToPay=31.35}, 新计算小时数{EmployeeID=888,TimeToPay=23.25} }; //表演 var actual=itrs.CalculateTimeToPay(payrollWeekStart,payrollWeekEnd).ToList(); //断言 var compareLogic=新的compareLogic(); var结果=比较逻辑。比较(实际、预期); Assert.IsTrue(result.AreEqual,result.differenceString); } #端区

C# Pay=24}, 新计算小时数{EmployeeID=777,TimeToPay=31.35}, 新计算小时数{EmployeeID=888,TimeToPay=23.25} }; //表演 var actual=itrs.CalculateTimeToPay(payrollWeekStart,payrollWeekEnd).ToList(); //断言 var compareLogic=新的compareLogic(); var结果=比较逻辑。比较(实际、预期); Assert.IsTrue(result.AreEqual,result.differenceString); } #端区,c#,entity-framework,linq,unit-testing,C#,Entity Framework,Linq,Unit Testing,用于在内存收集中以秒为单位获取不同的日期,如下图所示 var diffInSeconds = (dateTime1 - dateTime2).TotalSeconds; 您正在使用的函数用于处理sql数据库,而不是内存中的集合 它的失败是因为您依赖的是浮点值或十进制值,我建议您尝试类似于数学的方法。舍入(val,2)并检查结果。但是比较两个十进制值或浮点值始终是个问题,最好将值放在不带小数部分的整数值上 下面是一个双重比较的例子,这会导致输出值false在您的情况下发生同样的事情 // In

用于在内存收集中以秒为单位获取不同的日期,如下图所示

var diffInSeconds = (dateTime1 - dateTime2).TotalSeconds;
您正在使用的函数用于处理sql数据库,而不是内存中的集合


它的失败是因为您依赖的是
浮点值
十进制值
,我建议您尝试类似于
数学的方法。舍入(val,2)
并检查结果。但是比较两个十进制值或浮点值始终是个问题,最好将值放在不带小数部分的整数值上

下面是一个双重比较的例子,这会导致输出值
false
在您的情况下发生同样的事情

// Initialize two doubles with apparently identical values
double double1 = .33333;
double double2 = 1/3;
// Compare them for equality
Console.WriteLine(double1.Equals(double2));    // displays false
您可以在这里查看:

我要删除你代码的这一部分

TimeToPay = (empGroup.Where(x => x.EmployeeID == 
 empGroup.Key.EmployeeID).Sum(x => (SqlFunctions.DateDiff("second",
 x.PayTimeIn, x.PayTimeOut))/60.0/60.0)) ?? 0

您已经向实体提到了LINQ;因此,我建议您在测试和代码中尝试使用
Dbfunctions
(我以前遇到过这个问题,而这种切换使情况完全不同。下面是一个相关问题,它引出了其他相关问题:)

但是,
DbFunctions
没有
DateDiff
,因此您必须在您的案例中使用

// Initialize two doubles with apparently identical values
double double1 = .33333;
double double2 = 1/3;
// Compare them for equality
Console.WriteLine(double1.Equals(double2));    // displays false
因此,您的线路将更改为:

TimeToPay = (empGroup.Where(x => x.EmployeeID == empGroup.Key.EmployeeID).Sum(x => (DbFunctions.DiffSeconds(x.PayTimeIn, x.PayTimeOut))/60.0/60.0)) ?? 0
注意:这仅在查询提供程序被充分模拟的测试中有效。首选(关于如何插入),或EF Core的内存数据库。你可以试着去模仿你自己的提供者,但是仅仅为了让这些测试工作起来,这将是一个糟糕的想法


此外,一旦切换到足够的内存中数据上下文,就不用模拟
Find()
方法,而是将列表保存到数据库中,然后像平常一样进行查询。

No,它之所以失败是因为规范方法
SqlFunctions.DateDiff
调用,该调用仅在L2E查询中受支持。@IvanStoev-我不是说它失败是因为该函数,而是说它失败是因为这个计算
diffvalue/60.0/60.0))??0
。意味着由于您正在进行的除法,我要说的是由于该函数而失败:)@IvanStoev-
SqlFunctions.DateDiff
函数只能用于数据库…您应该将其用于内存收集数据。这与OP有相同的问题-“此函数只能从LINQ调用到实体。”在单元测试中执行时,返回相同的错误。我可能引用错误了吗
TimeToPay=(empGroup.Where(x=>x.EmployeeID==empGroup.Key.EmployeeID).Sum(x=>(System.Data.Entity.DbFunctions.DiffSeconds(x.PayTimeIn,x.PayTimeOut))/60.0/60.0))??0
哦。。。是的,你的推荐信可能是对的。我做了一个很大的假设——在我的测试中,我用它来模拟我的DbContext,它运行得非常好。当我尝试以我认为您已经做到的方式模拟存储库时,我得到了完全相同的错误:(回到绘图板。PS,你试过了吗?我没有。是否可以同时使用可查询和组合?我还有大约15个使用存储库的其他单元测试/方法。如果它们更健壮,我可以更改它们,尽管这是最后一块拼图。所以最好不要哈哈。不幸的是,你必须更改所有这些测试。)
列表上的ce
AsQueryable()
没有返回正确的提供程序(它应该返回
System.Data.Entity.Linq.QueryProvider
)。不过,从好的方面来说,由于它是最后一块拼图,这是您最后一次必须进行更改;)
TimeToPay = (empGroup.Where(x => x.EmployeeID == empGroup.Key.EmployeeID).Sum(x => (DbFunctions.DiffSeconds(x.PayTimeIn, x.PayTimeOut))/60.0/60.0)) ?? 0