C# 使用JavaScriptSerializer比较两个日期
在我的单元测试中,使用NUnit,我试图使用 它可以正常工作,但对于DateTime属性,它会引发此错误C# 使用JavaScriptSerializer比较两个日期,c#,json,nunit,C#,Json,Nunit,在我的单元测试中,使用NUnit,我试图使用 它可以正常工作,但对于DateTime属性,它会引发此错误 String lengths are both 498. Strings differ at index 65. Expected: "...onDateTime":"\\/Date(1410857388258)\\/","TransactionID":"Tra..." But was: "...onDateTime":"\\/Date(1410857388000)\\/","Transa
String lengths are both 498. Strings differ at index 65.
Expected: "...onDateTime":"\\/Date(1410857388258)\\/","TransactionID":"Tra..."
But was: "...onDateTime":"\\/Date(1410857388000)\\/","TransactionID":"Tra..."
---------------------------------------------^
我使用的代码是
[Test]
public void FromResponseToDecisionResponse_MapsAllProperties()
{
//Arrange
var now = DateTime.Now;
var sourceResponse = CreateSourceResponse(now);
var targetDecisionResponse = CreateTargetDecisionResponse(now);
//Act
var mappedResponse = _mapper.FromResponseToDecisionResponse(sourceResponse);
//Assert
AreEqualByJson(targetDecisionResponse, mappedResponse);
}
存在
在进入AreEqualByJson之前,日期是相同的,但是当它们被序列化时,我得到了这个偏移量,这使得我的测试失败
是否有什么问题,或者我应该在AreEqualByJson中将所有日期视为特殊情况(仍然将其作为可重用方法维护)
谢谢
更新
根据Marc Gravell的评论,我最终在CreateTargetDecisionResponse中这样做了
TransactionDateTime=DateTime.Parse(now.ToString(“yyy-MM-ddThh:MM:sss”))对象1,
TransactionDateTime=now.ToString(“yyy-MM-ddThh:MM:sss”)
(假设FromResponseToDecisionResponse
正在将字符串转换回DateTime)
对象2,TransactionDateTime=now,
如果两者结果相同,那只能是巧合。。i、 e.当<代码>现在<代码>没有任何小数秒时
这是测试中最明显的错误部分。它们相差258ms;由于您似乎使用的是
yyyy-MM-ddThh:MM:sss
,我不确定这种亚秒级的差异是否会出乎意料……谢谢,@marcgravel。你完全正确。最后我做了一些棘手的事情(见更新),但由于这只是针对这个特定测试的私有方法,我很满意。比较强类型方法和泛型方法会更简洁。如果您不想在测试中引入对某些类的依赖,可以序列化对象(我建议使用Json.Net,因为它的速度大约是Json.Net的3倍),然后(使用JavaScriptSerializer)将它们反序列化到字典中。
[Test]
public void FromResponseToDecisionResponse_MapsAllProperties()
{
//Arrange
var now = DateTime.Now;
var sourceResponse = CreateSourceResponse(now);
var targetDecisionResponse = CreateTargetDecisionResponse(now);
//Act
var mappedResponse = _mapper.FromResponseToDecisionResponse(sourceResponse);
//Assert
AreEqualByJson(targetDecisionResponse, mappedResponse);
}
private static Response CreateSourceResponse(DateTime now)
{
var sourceResponse = new Response
{
//More properties
TransactionDateTime = now.ToString("yyyy-MM-ddThh:mm:sss")
};
return sourceResponse;
}
private static DecisionResponse CreateTargetDecisionResponse(DateTime now)
{
var targetDecisionResponse = new DecisionResponse
{
//Other properties
TransactionDateTime = now,
//More properties
};
return targetDecisionResponse;
}