我希望能够使用NUnit的Assert.That
来比较IConvertible
到DateTime
之间的任何两件事情,最好不要创建自定义约束。我有一个简单的IComparer
,很好地诀窍。它与EqualTo().Using()
,一起使用,只要实际和预期的是相同类型。看起来EqualsConstraint
的AdjustArgumentIfNeeded
方法在我的IComparer
开始工作之前没有做出断言。我可以使用NUnit的EqualTo()来比较不同类型的对象吗?使用()?
如果实际和预期的实际和预期可以转换为相同的日期时间并且否则失败,我应该怎么做以允许任何形式Assert.That(actual, Is.EqualTo(expected).Using(DateTimeComparer.Instance));
的测试通过?
下面是一个MCVE,它显示两个测试通过时,我比较从不同的格式字符串转换的日期,但失败时转换日期与真正的日期时间进行比较。
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()'。这显然是很冒险的,并且让我接触到可能存在的文化问题(因为在二月的某个时候,还有一些人阅读“02/08/2016”......),但它现在还在工作。 –