我处理了许多项目,每个项目都包含一个DateProcessed属性(可以为空的DateTime),并希望Assert将该属性设置为当前日期。当它完成处理程序时,日期都略有不同。
我想测试所有DateProcessed属性是否具有相对性(100ms)最近的DateTime。
Fluent Assertions具有.BeCloseTo方法,适用于单个项目。但我想将它用于整个系列。但是在查看集合时,它无法通过Contains()获得。
一个简化的例子......
[TestFixture]
public class when_I_process_the_items
{
[SetUp]
public void context()
{
items = new List<DateTime?>(new [] { (DateTime?)DateTime.Now, DateTime.Now, DateTime.Now } );
}
public List<DateTime?> items;
[Test]
public void then_first_item_must_be_set_to_the_current_time()
{
items.First().Should().BeCloseTo(DateTime.Now, precision: 100);
}
[Test]
public void then_all_items_must_be_set_to_the_current_time()
{
items.Should().Contain .... //Not sure? :(
}
}
答案 0 :(得分:11)
您可以通过将选项配置为ShouldBeEquivalentTo
来在3.5中执行此操作。例如:
result.ShouldBeEquivalentTo(expected, options =>
{
options.Using<DateTime>(ctx => ctx.Subject.Should().BeCloseTo(ctx.Expectation)).WhenTypeIs<DateTime>();
return options;
});
或succintly:
result.ShouldBeEquivalentTo(expected, options => options.Using<DateTimeOffset>(ctx => ctx.Subject.Should().BeCloseTo(ctx.Expectation)).WhenTypeIs<DateTimeOffset>());
如果要全局设置,请在测试框架的夹具设置方法中实施以下内容:
AssertionOptions.AssertEquivalencyUsing(options =>
{
options.Using<DateTime>(ctx => ctx.Subject.Should().BeCloseTo(ctx.Expectation)).WhenTypeIs<DateTime>();
options.Using<DateTimeOffset>(ctx => ctx.Subject.Should().BeCloseTo(ctx.Expectation)).WhenTypeIs<DateTimeOffset>();
return options;
});
答案 1 :(得分:2)
作为对您问题的直接回答,您可以执行items.Should().OnlyContain(i => (i - DateTime.Now) < TimeSpan.FromMilliseconds(100))
。
然而,依赖DateTime.Now
的单元测试是一种非常糟糕的做法。你能做的就是介绍这样的东西:
public static class SystemContext
{
[ThreadStatic]
private static Func<DateTime> now;
public static Func<DateTime> Now
{
get { return now ?? (now = () => DateTime.Now); }
set { now = value; }
}
}
然后,不要引用DateTime.Now
,而是使用SystemContext.Now()
来获取当前时间。如果你这样做,你可以“设置”特定单位测试的当前时间,如下所示:
SystemContext.Now = () => 31.March(2013).At(7, 0);
答案 2 :(得分:-1)
刚刚解决了这个......
[Test]
public void then_all_items_must_be_set_to_the_current_time()
{
items.Should().OnlyContain(x => DateTime.Now.Subtract(x.Value).Milliseconds <= 100);
}
但是,如果有人知道一个&#39; out the box n#39;流利的断言方式,请告诉我。