2013-01-16 2 views
1

Objective-C의 단위 코드 테스트에 문제가 있습니다. 시간대에 일광 절약 시간에 대한 정보가 포함되어 있으므로 여름에 테스트를 작성하여 6 월 10 일에 일출이 예상됩니다. 오전 6시 2 분에 발생합니다. 테스트가 통과되면 나중에 DST가 아니고 실패 할 때 테스트를 실행합니다. 왜냐하면 시간대를 가져 오면 일광 절약법이 해제되어 있기 때문입니다.단위 테스트에서 NSTimeZone 문제 해결하기

dst를 켠 상태에서 시간대를 지정하는 방법은 간단하지 않습니까?

나는 시간대 호출을 가로 채기 위해 카테고리를 만들려고 생각하고 있었지만, 어떤 날짜를 조작하고 있는지 모르기 때문에 너무 지저분 해 보인다.

물론 모든 테스트를 작성하여 표준 시간대 설정을 확인한 다음 모든 기대치를 바꿀 수는 있지만 가능한 모든 선택 사항 중 최악의 경우라고 생각됩니다.

답변

2

지역 특정 시간대는 두 날짜 (및 시간) 사이의 간격을 정확하게 계산하려면 일광 절약 시간을 고려해야합니다. 이것에 관심이 없다면 아마도 UTC “ 시간대 ”을 사용할 수 있습니다. 전혀 변경되지 않습니다.

예를 들어, 뉴질랜드 표준시는 UTC + 12 : 00으로, 뉴질랜드 일광 절약 시간은 UTC + 13 : 00으로 정의됩니다. 뉴질랜드의 현지 시간은 일광 절약 시간제와 다르지만 UTC + 12 : 00의 시간은 동일하게 유지됩니다 (즉, UTC + 12 : 00을 사용하는 모든 국가는 일광 절약 시간 뉴질랜드에서 시작되었습니다).

당신은 단순히 이름으로 오프셋 UTC를 제공함으로써이를 달성 할 수

NSTimeZone *utc_plus12 = [NSTimeZone timeZoneWithName:@"UTC+12:00"]; 

는 UTC가 해당 지역의 일광 절약 시간에 따라 그를 사용 오프셋 알아보십시오.

+0

내가 관심이 없다는 것은 아니며 테스트가 실행될 때 테스트 될 날짜가 아닌 오늘의 DST 설정을 제공 할 것이라는 점입니다. 그것이 문제이다? 그러나 테스트가 실행될 때마다 GMT로부터의 오프셋이 동일하게 유지 될 수 있으므로 솔루션이 좋은 것으로 판단됩니다. – Rob

+0

@Rob : 오, 죄송합니다. 질문을 잘못 읽었습니다. 나는 UTC를 사용하는 것이 좋은 접근법이라고 생각한다.'daylightSavingTimeOffsetForDate :'와 같은'NSTimeZone' 메쏘드 (보통 시간대가 DST에있을 때 3600을 리턴한다.)를 가지고 놀 수 있고 NSDates에 이것을 추가 할 수있다. 비교할 필요가있는 – dreamlax

1

비슷한 문제가 발생했습니다. 마침내 나는 OCMock을 발견했고 내 생명을 구했다.
Cocoapods을 사용하는 경우 좋습니다.

  1. 을 편집 Podfile 및 OCMock을 가져올 줄을 추가 : 다음 단계입니다. 당신의 단위 테스트 클래스

    target 'YourProjectTests' do 
        pod 'OCMock' 
    end 
    
  2. 추가 수입은

    #import <OCMock/OCMock.h> 
    
  3. 그 코드는 원래 [NSTimeZone localTimeZone] 방법을 조롱하고 을 반환이

    - (void)testLocalTimezoneFromPDT { 
        NSTimeZone* timeZone = [NSTimeZone timeZoneWithAbbreviation:@"PDT"]; 
        id timeZoneMock = OCMClassMock([NSTimeZone class]); 
        OCMStub([timeZoneMock localTimeZone]).andReturn(timeZone); 
    
        // Implement your test case 
        // XCTAssertEqual(...); 
    } 
    

처럼 테스트 케이스를 작성 정적 값.
이 예에서는 태평양 표준시 (PDT) [GMT-07 : 00] 에서 시간대를 반환합니다.
클래스를 [NSTimeZone localTimeZone]으로 호출하면 클래스에 OCMock으로 설정 한 시간대가 설정됩니다.

이 답변이 도움이 되길 바랍니다.