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 错误。

IE

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

当我注释掉观察者模拟代码时,我的测试每次都运行良好。

当我将代码放回原处时,我在 postNoticiaitonName:object:userInfo 上得到了虚假的崩溃,可能每 2.5 次发生一次。

有人有什么想法吗?

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 回答
1

发生这种情况有几个原因(我知道,因为我今天刚刚在自己的代码中解决了这两个问题)

1) 前一个测试的模拟观察者没有被移除

2) 来自先前测试的非模拟实例对象正在观察相同的通知,但该对象已过时。在我的例子中,我的setUp方法中的一个实例对象正在监听通知,但是当它被释放时,它并没有从 NSNotificationCenter 的观察者列表中删除自己。

在这两种情况下,解决方案都是使用

  [[NSNotificationCenter defaultCenter] removeObserver:name:object:]

取决于范围:1)在dealloc观察 NSNotificationCenter 的所有类中,2)在tearDown方法中,或 3)在测试用例结束时(如 @PrasadDevadiga 所述)

于 2014-05-08T04:27:45.503 回答