2

次のようにモックオブザーバーをセットアップします。

id quartileObserverMock = [OCMockObject observerMock];
[[NSNotificationCenter defaultCenter] addMockObserver:quartileObserverMock
                                                 name:kVPAdPlayerDidReachQuartileNotification
                                               object:self.adPlayer];

[[quartileObserverMock expect]
                       notificationWithName:kVPAdPlayerDidReachQuartileNotification
                                     object:self.adPlayer
                                   userInfo:@{@"quartile" : @(VPAdPlayerFirstQuartile), @"trackingEvent" : VPCreativeTrackingEventFirstQuartile}];

単体テストが実行されます。しかし、通知が投稿されたときに誤った EXC_BAD_ACCESS エラーが発生します。

すなわち

[[NSNotificationCenter defaultCenter]
                           postNotificationName:kVPAdPlayerDidReachQuartileNotification
                                         object:self.adPlayer
                                       userInfo:@{@"quartile" : @(quartile), @"trackingEvent" : trackingEvent}];

オブザーバーモック コードをコメント アウトすると、毎回テストが正常に実行されます。

コードを元に戻すと、おそらく 2.5 回に 1 回、postNotiicaitonName:object:userInfo で偽のクラッシュが発生します。

誰でもアイデアはありますか?

4

2 に答える 2

8

次のサンプル コードを参照してください。それは私のために働いた

- (void)test__postNotificationwithName__withUserInfo
{
     id observerMock  = [OCMockObject observerMock];
     [[NSNotificationCenter defaultCenter] addMockObserver:observerMock name:@"NewNotification" object:nil];

     NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:@"2",@"2", nil];
     [[observerMock expect] notificationWithName:@"NewNotification" object:[OCMArg any] userInfo:userInfo];

     NotificationClass *sut = [[NotificationClass alloc] init];
     [sut postNotificationwithName:@"NewNotification" userInfo:userInfo];

     [[NSNotificationCenter defaultCenter] removeObserver:observerMock];
     [observerMock verify];
}

そして私の投稿通知方法

- (void)postNotificationwithName:(NSString *)notifName userInfo:(NSDictionary *)userInfo
{
     [[NSNotificationCenter defaultCenter] postNotificationName:notifName object:self userInfo:userInfo];
}

ご注意ください:

  1. 予期しない通知を受信すると、observerMock は常に例外を発生させます。
  2. テスト ケースの最後で、モックされたオブザーバーを NSNotificationCenter から削除します。
于 2013-05-07T09:16:19.333 に答える