LoginSignup
0
0

More than 5 years have passed since last update.

OCMockを利用してNSDateをStub化する

Last updated at Posted at 2017-05-19

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]];
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0