【发布时间】:2016-08-02 03:25:12
【问题描述】:
我希望能够使用 NUnit 的 Assert.That 比较 IConvertible 和 DateTime 的任意两件事,最好不要创建自定义约束。我有一个简单的IComparer 可以很好地解决问题。它适用于EqualTo().Using(),只要实际和预期的类型相同。看起来EqualsConstraint 的AdjustArgumentIfNeeded 方法在我的IComparer 开始工作之前使断言失败。
如果实际和预期可以转换为相同的日期时间,我该怎么做才能让Assert.That(actual, Is.EqualTo(expected).Using(DateTimeComparer.Instance)); 形式的任何测试通过,否则失败?
这是一个 MCVE,它显示当我比较从不同格式字符串转换的日期时通过了两个测试,但在比较转换后的日期与实际 DateTime 时失败。
using NUnit.Framework;
namespace NunitTest
{
public class DateTimeComparer : IComparer
{
public static readonly DateTimeComparer Instance = new DateTimeComparer();
public int Compare(object x, object y)
{
var dateTime1 = Convert.ToDateTime(x);
var dateTime2 = Convert.ToDateTime(y);
return dateTime1.CompareTo(dateTime2);
}
}
[TestFixture]
public class DateTimeComparerTest
{
[Test]
public void TestComparerUsingString()
{
// Passes
Assert.That("2 August 2016",
Is.EqualTo("02/08/2016")
.Using(DateTimeComparer.Instance));
}
[Test]
public void TestComparerUsingDateTime()
{
// Passes
Assert.That(new DateTime(2016, 8, 2),
Is.EqualTo(new DateTime(2016, 8, 2))
.Using(DateTimeComparer.Instance));
}
[Test]
public void TestComparerUsingExpectedDateTime()
{
// Fails
Assert.That("2 August 2016",
Is.EqualTo(new DateTime(2016, 8, 2))
.Using(DateTimeComparer.Instance));
}
[Test]
public void TestComparerUsingActualDateTime()
{
// Fails
Assert.That(new DateTime(2016, 8, 2),
Is.EqualTo("2 August 2016")
.Using(DateTimeComparer.Instance));
}
}
}
调试显示,两个通过的情况下都输入了Compare方法,两个失败的情况下都没有输入。
【问题讨论】:
-
我目前的解决方法是致电
ToString()了解我所有的实际情况和预期。这显然是 hacky,并且让我接触到可能的文化问题(因为仍然有一些人在 2 月的某个时间阅读“02/08/2016”......),但它现在正在工作。