unit-testing - Fluent NHibernate CheckProperty and Dates

标签 unit-testing fluent-nhibernate date

我设置了一个 NUnit 测试:

new PersistenceSpecification<MyTable>(_session)
    .CheckProperty(c => c.ActionDate, DateTime.Now);

当我通过 NUnit 运行测试时,出现以下错误:
SomeNamespace.MapTest: 
System.ApplicationException : Expected '2/23/2010 11:08:38 AM' but got 
'2/23/2010 11:08:38 AM' for Property 'ActionDate'

ActionDate 字段是 SQL 2008 数据库中的日期时间字段。我使用自动映射并将 ActionDate 声明为 C# 中的 DateTime 属性。

如果我将测试更改为使用 DateTime.Today,则测试通过。

我的问题是为什么 DateTime.Now 测试失败?将日期保存到数据库时,NHibernate 是否会丢失一些精度,如果是这样,如何防止丢失?谢谢你。

最佳答案

由于 sql server 无法存储所有毫秒(但四舍五入为 .003/.004/.007 秒的增量,如您在 msdn 看到的那样),您应该在将其传递给 CheckProperty 方法之前截断 C# 中的 DateTime 值,因为由于精度损失,从数据库中检索到的 DateTime 与您的 DateTime.Now 不同。

例如,如果您只需要秒的精度,您可以截断毫秒,如 SO 问题的答案所示:How to truncate milliseconds off of a .NET DateTime .
如果您需要更高的精度,您应该使用 timestamp映射类型。

您可以使用扩展方法轻松截断毫秒:

public static class DateTimeExtension
{
  public static DateTime TruncateToSeconds(this DateTime source)
  {
    return new DateTime(source.Ticks - (source.Ticks%TimeSpan.TicksPerSecond), source.Kind);
  }
}
//<...>
new PersistenceSpecification<MyTable>(_session)
    .CheckProperty(c => c.ActionDate, DateTime.Now.TruncateToSeconds());

关于unit-testing - Fluent NHibernate CheckProperty and Dates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2320743/

相关文章:

c# - 如何使用 FluentAssertions 断言属性的默认值?

java - 列表上随机播放方法的单元测试

c# - log4net 是否会杀死我的 WCF 单元测试?

nhibernate - 如何映射到具有与父级 ID 不同的列的连接子类?

MySQL数据字段转oracle

php - 计算结束日期 : PostgreSQL 的年份

unit-testing - 如何模拟指令以启用更高级别指令的单元测试?

.net - 是否可以使用流畅的 nhibernate 映射设置 SQL 服务器列的描述?

nhibernate - 如何在 NHibernate 中使用 CompositeId 级联保存?

java - 将日期转换为全文