NSDateFormatterを使って日付文字列を取得するときに、[NSDate date]で現在の時刻を取得すると取得時ごとに時間が変化してしまうので、正しいフォーマットの文字列が出力されているかをテストすることが難しくなります。
そこで、[NSDate date]で得られる値を固定化できれば、正しいフォーマットで文字列が作成されているかを確認することができます。
OCMClassMockを利用してNSDateをStub化する
id dateMock = OCMClassMock([NSDate class]);
NSString *mockTimeStamp = @"1494925200"; //2017-05-16T09:00:00Z in UTC
OCMStub([dateMock date]).andReturn([NSDate dateWithTimeIntervalSince1970:[mockTimeStamp intValue]]);
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];
NSString *dateStr = [dateFormatter stringFromDate:[NSDate date]];
XCTAssertEqualObjects(dateStr,@"2017-05-16T09:00:00Z");
これで、指定した固定の文字列でテストできるようになりました。
メソッド内での使用
メソッド内で使用している場合も同じになります。
id dateMock = OCMClassMock([NSDate class]);
NSString *mockTimeStamp = @"1494925200"; //2017-05-16T09:00:00Z in UTC
OCMStub([dateMock date]).andReturn([NSDate dateWithTimeIntervalSince1970:[mockTimeStamp intValue]]);
MyClass *myObject = [MyClass alloc]init];
NSString *dateStr = [myObject createDateString];
XCTAssertEqualObjects(dateStr,@"2017-05-16T09:00:00Z");
MyClass.m
- (NSString *)createDateString {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];
return [dateFormatter stringFromDate:[NSDate date]];
}