我的测试今天(5月29日)失败了。这是一个非常简单的测试,它可以验证在最近3个月内是否购买了某物,它遵循...
var purchaseDate = DateTimeOffset.Now.AddMonths(-3); // returns the 28th of February
Assert.True(purchaseDate.AddMonths(3).Date >= DateTimeOffset.Now.Date) // 28th of February + 3 months is the 28th of May
该测试仅在今天失败。
我假设这个问题以前已经遇到过很多次了,所以,有没有一种方法可以在不切换5月29日逻辑的情况下进行处理?
最佳答案
我认为您的问题更多是设计错误。我将当前日期作为可选依赖项注入,以确保可以使用所需的任何值进行测试。
让我们以这个小型服务为例:
(使用任何您喜欢的DI)
public class MyService {
// Private variables that will be initialized by constructor
private readonly DateTimeOffset now;
public MyService(MyFirstDependency dependency, DateTimeOffset now = DateTimeOffset.Now) {
// Assign here your private variables
this.now = now;
}
public void ValidateDateIsNotBefore3MonthsAgo(DateTimeOffset myDateToValidate) {
if (!myDateToValidate.AddMonths(3).Date >= now.Date) {
throw new WhateverYouWantException("Date is before 3 months ago");
}
}
}
这样,当您实例化测试时,您可以传递带有所选择值的DateTimeOffset。您不再依赖当前日期。
编辑:我忘记了您也可以使用Fakes来模拟当前日期而无需修改代码,但是它是not available for every version of Visual Studio