单元测试只是我似乎永远无法理解的事情,但我可以看到它为什么重要并且可以节省大量时间(如果您知道自己在做什么)。我希望有人能指出我正确的方向。
我有以下UIViewController
QBElectricityBaseVC.h
@interface QBElectricityBaseVC : QBStateVC
@property (nonatomic, strong) QBElectricityUsage *electricityUsage;
@property (nonatomic, assign) CGFloat tabBarHeight;
- (void)updateElectricityUsage;
@end
QBElectricityBaseVC.m
@implementation QBElectricityBaseVC
- (instancetype)init
{
self = [super init];
if (self) {
self.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"electricity_title", nil) image:nil tag:0];
}
return self;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.notificationCenter addObserver:self selector:@selector(updateElectricityUsage)
name:kUpdatedElectricityUsageKey object:nil];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[self.notificationCenter removeObserver:self];
}
- (void)updateElectricityUsage
{
self.electricityUsage = [self.stateManager electricityUsage];
}
- (CGFloat)tabBarHeight
{
return self.tabBarController.tabBar.frame.size.height;
}
@end
我应该测试什么?
kUpdatedElectricityUsageKey
添加了一个观察者self.electricityUsage
成为一个实例QBElectricityUsage
- A
tabBarHeight
被退回 - 一个观察者
kUpdatedElectricityUsageKey
被移除
我错过了什么我应该测试或测试我真的不应该测试的东西吗?
我该如何测试?
所以我正在尝试使用Specta和Expexta来做到这一点。如果我需要模拟任何东西,我会使用OCMockito。
我真的不知道如何测试添加/删除观察者。我在 Expexta 文档中看到以下内容,但不确定它是否相关/如何使用它:
expect(^{ /* code */ }).to.notify(@"NotificationName"); passes if a given block of code generates an NSNotification named NotificationName.
expect(^{ /* code */ }).to.notify(notification); passes if a given block of code generates an NSNotification equal to the passed notification.
为了测试它self.electricityUsage
成为一个实例,QBElectricityUsage
我可以创建一个类别,该类别具有一个方法,该方法只是假装通知已触发并调用该updateElectricityUsage
方法,但这是最好的方法吗?
至于tabBarHeight
,我应该只测试它是否返回一个有效值CGFloat
而不用担心值是什么?
更新
我将viewWillAppear
方法更改为如下所示:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self addNotificationObservers];
}
- (void)addNotificationObservers
{
[self.notificationCenter addObserver:self selector:@selector(updateElectricityUsage)
name:kUpdatedElectricityUsageKey object:nil];
}
然后我创建了以下测试:
#import "Specs.h"
#import "QBElectricityBaseVC.h"
#import "ElectricityConstants.h"
SpecBegin(QBElectricityBaseVCSpec)
describe(@"QBElectricityBaseVC", ^{
__block QBElectricityBaseVC *electricityBaseVC;
__block NSNotificationCenter *mockNotificationCenter;
beforeEach(^{
electricityBaseVC = [QBElectricityBaseVC new];
mockNotificationCenter = mock([NSNotificationCenter class]);
electricityBaseVC.notificationCenter = mockNotificationCenter;
});
afterEach(^{
electricityBaseVC = nil;
mockNotificationCenter = nil;
});
it(@"should have a notification observer for updated electricity usage", ^{
[electricityBaseVC addNotificationObservers];
[verify(mockNotificationCenter) addObserver:electricityBaseVC selector:@selector(updateElectricityUsage)
name:kUpdatedElectricityUsageKey object:nil];
});
});
SpecEnd
该测试现在通过了,但这是测试它的正确/最佳方法吗?