3

Objective-C でカレンダー コードの単体テストを実行する際の問題点は次のとおりです。タイムゾーンには夏時間に関する情報が含まれているため、6 月 10 日の日の出が午前 6 時 2 分になることを期待して、夏にテストを作成します。テストに合格し、後で DST ではないときにテストを実行すると失敗します。タイムゾーンを取得すると、夏時間がオフになるためです。

dstがオンになっているタイムゾーンを提供するように指示する簡単な方法はないようです?

タイムゾーンの呼び出しを傍受できるようにカテゴリを作成することを考えていましたが、操作している日付がわからないため、非常に面倒です。

もちろん、タイムゾーンの設定を確認するためにすべてのテストを作成してから、すべての期待をシフトすることもできますが、それは考えられるすべての選択肢の中で最悪のように思えます。

4

2 に答える 2

2

地域固有のタイムゾーンでは、2 つの日付 (および時刻) の間の間隔を正確に計算するために、夏時間を考慮する必要があります。これに興味がない場合は、代わりに UTC の「タイムゾーン」を使用できますが、これはまったく変更されません。

たとえば、ニュージーランド標準時は UTC+12:00 として定義され、ニュージーランドの夏時間は UTC+13:00 として定義されます。ニュージーランドの現地時間は夏時間中に異なりますが、UTC+12:00 の時間は同じままです (つまり、UTC+12:00 を使用している他のすべての国では、夏時間のためだけに魔法のように進むことはありません)。ニュージーランドで始まった)。

その UTC オフセットを名前として指定するだけで、これを実現できます。

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

お住まいの地域の夏時間の UTC オフセットが何に基づいているかを調べて、それを使用してください。

于 2013-01-16T23:39:03.533 に答える
1

同様の問題が発生しました。やっと見つけOCMockて一命を取り留めました。
を使用している場合Cocoapods、それは素晴らしいことです。手順は次のとおりです。

  1. Podfile を編集し、OCMockをインポートする行を追加します。

    target 'YourProjectTests' do
        pod 'OCMock'
    end
    
  2. 単体テスト クラスにインポートを追加します。

    #import <OCMock/OCMock.h>
    
  3. このようにテストケースを書きます

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

そのコードは元の[NSTimeZone localTimeZone]メソッドをモックし、静的な値を返します。
この例では、太平洋夏時間 (PDT) [GMT-07:00]からタイムゾーンを返します。
クラスが を呼び出す[NSTimeZone localTimeZone]と、クラスは で設定したタイムゾーンを取得しOCMockます。

この回答がお役に立てば幸いです。

于 2016-09-16T03:26:35.943 に答える