Cocoa touch 更改Cocoa单元测试的系统日期

Cocoa touch 更改Cocoa单元测试的系统日期,cocoa-touch,cocoa,unit-testing,nsdate,Cocoa Touch,Cocoa,Unit Testing,Nsdate,我正在测试一个方法,该方法调用-[NSDate],并使用系统时间作为参考来执行一些逻辑。我需要在一年中的某些特定日子测试逻辑是否正确,但我不能等到那一天。因此,我可以在单元测试时以编程方式更改系统日期吗?您需要使用,在Objective C中,您可以通过只覆盖您需要的方法轻松地使用类别来更改系统日期。例如,您可以使用以下类别: // ------------- File: NSDate+NSDateMock.h @interface NSDate (NSDateMock) +(void)se

我正在测试一个方法,该方法调用
-[NSDate]
,并使用系统时间作为参考来执行一些逻辑。我需要在一年中的某些特定日子测试逻辑是否正确,但我不能等到那一天。因此,我可以在单元测试时以编程方式更改系统日期吗?

您需要使用,在Objective C中,您可以通过只覆盖您需要的方法轻松地使用类别来更改系统日期。例如,您可以使用以下类别:

// ------------- File: NSDate+NSDateMock.h
@interface NSDate (NSDateMock)

 +(void)setMockDate:(NSString *)mockDate;
 +(NSDate *) mockCurrentDate;

@end

// -------------- File: NSDate+NSDateMock.m

#import "NSDate+NSDateMock.h"

@implementation NSDate (NSDateMock)

static NSDate *_mockDate;

+(NSDate *)mockCurrentDate
{
    return _mockDate;
}

+(void)setMockDate:(NSString *)mockDate
{
    _mockDate = [NSDate dateWithString:mockDate];
}

@end
此外,您还需要

然后在单元测试中,您将能够像这样使用它

SwizzleClassMethod([NSDate class], @selector(date), @selector(mockCurrentDate));
[NSDate setMockDate:@"2007-03-24 10:45:32 +0200"];
NSLog(@"Date is: %@", [NSDate date]);

通常,您可以覆盖类别中的
-[NSDate date]
,以返回特定日期。
SwizzleClassMethod([NSDate class], @selector(date), @selector(mockCurrentDate));
[NSDate setMockDate:@"2007-03-24 10:45:32 +0200"];
NSLog(@"Date is: %@", [NSDate date]);