3

在我的基础模拟类中:

- (void)tearDown
{
    _mockApplication = nil;
    self.observerMock = nil;
    self.notificationCenterMock = nil;
}

其中 notificaitonCenterMock 只是一个 id;

然后在我的测试中我做这样的事情:

self.notificationCenterMock = [OCMockObject partialMockForObject:[NSNotificationCenter defaultCenter]];
[(NSNotificationCenter *) [self.notificationCenterMock expect]
        removeObserver:self.component
                  name:UIApplicationDidBecomeActiveNotification
                object:nil];

现在.. 如果我运行此代码,我的单元测试将虚假地失败(即一次运行 370 个中只有 60 个将运行,下一次运行 70 或 65 个)。我的几个单元测试将失败并出现以下错误:

OCPartialMockObject[NSNotificationCenter]: expected method was not invoked: removeObserver:    
<VPBCAdComponent-0x17d43e0-384381847.515513: 0x17d43e0> name:@"UIApplicationDidBecomeActiveNotification" object:nil
Unknown.m:0: error: -[VPBCAdComponentTests testCleanUpAfterDisplayingClickthrough_adBrowser_delegateCallback] :       
OCPartialMockObject[NSNotificationCenter]: expected method was not invoked: removeObserver:
<VPBCAdComponent-0x17d43e0-384381847.515513: 0x17d43e0> name:@"UIApplicationDidBecomeActiveNotification" object:nil

然后将终止测试。我可以清楚地看到,部分模拟通知中心会导致运行测试套件出现问题。

问题是,我该怎么办?确保设置诸如观察者之类的重要事物以及回归证明会非常好。

4

2 回答 2

0

如果在这种情况下你可以避免部分模拟,那就去做吧。如果您只想测试添加和删除观察者,您应该能够使用标准模拟或漂亮模拟。

如果你可以隔离几个测试来验证观察者的添加和删除,那么它不应该有这样的连锁反应吗?

id mockCenter = [OCMockObject mockForClass:[NSNotificationCenter class]];
[[mockCenter expect] addObserver:observer options:UIApplicationDidBecomeActiveNotification context:nil];

// method on the Subject Under Test

[mockCenter verify];
于 2013-04-25T17:44:44.140 回答
0

在这种情况下,我个人使用本地模拟。较小的模拟范围可确保减少对应用程序其他部分的干扰。在 NSUserDefaults 或其他共享对象的情况下更重要。我使用的测试模式是一样的。

- (void)testRegisterNofificaitonTest {
    id ncMock = OCMClassMock([NSNotificationCenter class]);
    OCMStub([ncMock defaultCenter]).andReturn(ncMock);

    UIViewController *sut = [UIViewController new];
    [[ncMock expect] addObserver:sut selector:@selector(doSomething:) name:@"NotificationName" object:nil];

    [sut viewDidLoad]; //assuming viewDidLoad calls [[NSNotificationCenter defaultCenter] addObserver: ...

    [ncMock verify];
    [ncMock stopMocking];
}
于 2017-03-06T11:19:07.050 回答