簡體   English   中英

如何為Singleton XCTest Framework xcode 7編寫測試用例

[英]How to write test cases for singleton XCTest Framework xcode 7

我剛剛開始學習使用XCTest和xcode 7.2編寫單元測試,並且我認為此Xcode不支持OCMock框架。 我對這個框架工作一無所知。我現在只有XCTest Framework。 我的問題是如何為單例對象編寫案例。 在這里,我使用了依賴注入的一些代碼來制作屬性和全部。

@property (nonatomic, strong) UIApplication *application;

- (UIApplication*)application
{
   if (!_application)
   {
       _application = [UIApplication sharedApplication];
   }
   return _application;
}

- (IBAction)pushNotificationsSwitchWasToggled:(id)sender
{
   UISwitch *toggleSwitch = sender;
   if (toggleSwitch.on)
   {
       [self.application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert)];
   }
   else
   {
       [self.application unregisterForRemoteNotifications];
   }
}

測試

如果要測試以上方法

- (void)testToggleOnRegistersForPushNotifications_On
{
   //given

   SettingsViewController *sut = [[SettingsViewController alloc] init];
   sut.application =[UIApplication sharedApplication];
//Here only one object is created ? not new right.
   [sut.pushNotificationsSwitch setOn:YES];

   //when
   [sut pushNotificationsSwitchWasToggled:sut.pushNotificationsSwitch];
//here I am expecting code whether registerForRemoteNotificationTypes method is called or not.

 }

1)在這里,當我們在任何地方使用單例時,僅創建對象一次。 在測試用例中,我不想使用實際的[UIApplication sharedApplication] 我要測試一個假的或假的對象。

2)我們如何確定是否注冊了遠程通知(通常如何確定是否調用方法?)。 不能與[UIApplication sharedApplication]一起使用NSUSerDefault (給出輸入並將結果與​​期望的結果進行比較)用任何單例進行解釋。

在測試中,您想注入其他東西來代替真正的UIApplication。 只要“其他”可以滿足您所需的方法,它就可以是任何東西。 我們甚至不必使用模擬對象框架。 例如:

@interface MockApplication : NSObject
@property (nonatomic, assign, readonly) NSUInteger registerForRemoteNotificationTypesCount;
@property (nonatomic, strong, readonly) NSMutableArray *remoteNotificationTypes;
@property (nonatomic, assign, readonly) NSUInteger unregisterForRemoteNotificationsCount;
@end

@implementation MockApplication

- (instancetype)init
{
    self = [super init];
    if (self)
    {
        _remoteNotificationTypes = [[NSMutableArray alloc] init];
    }
    return self;
}

- (void)registerForRemoteNotificationTypes:(UIRemoteNotificationType)types
{
    self.registerForRemoteNotificationTypesCount += 1;
    [self.remoteNotificationTypes addObject:@(types)];
}

- (void)unregisterForRemoteNotifications
{
    self.unregisterForRemoteNotificationsCount += 1;
}

@end

然后在您的測試代碼中:

MockApplication *mockApplication = [[MockApplication alloc] init];
sut.application = (id)mockApplication;

在測試結束時,您現在可以查詢模擬應用程序以查看被調用的內容和參數。

一旦了解了這一原理,便可以使用模擬對象框架(如OCMockOCMockito)節省時間。

我有一個截屏視頻,顯示了如何使用OCMockito模擬NSUserDefaults。 實際上,它還不止於此,因為它涵蓋了測試驅動開發:請參見Objective-C TDD:入門指南。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM