2017-08-25 90 views
0

試圖爲下面的函數創建簡單的測試:單元測試本地對象或OCMock的依賴注入?

-(void)presentWithString:(NSString *)name 
{ 
    CustomVC *customVC = [[CustomVC alloc] initWithName:name]; 
    UINavigationController *nav = [[UINavigationController alloc] init]; 
    nav.viewControllers = @[customVC]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.vc presentViewController:nav animated:YES completion:nil]; 
    }); 
} 

我可以拆分這與依賴注入塊,但不知道怎麼寫正確的測試兩種方式。這個例子的最佳做法是什麼?

回答

1

你是什麼想要來測試?在你的方法中有三件事情發生:

  1. CustomVC創建與name通過。
  2. CustomVC被嵌入導航控制器內。
  3. 導航控制器顯示在self.vc上。

您可以編寫一個測試,檢查整個流程:

- (void)testPresentWithString_shouldPresentCustomVC_withPassedName { 

    // Arrange 
    NSString *expectedName = @」name」; 
    XCTestExpectation *exp = [self expectationWothDescription:@」presentVC called」]; 

    TestClass *sut = [[TestClass alloc] init]; 
    id vcMock = OCMClassMock([UIViewController class]); 
    sut.vc = vcMock; 

    OCMExpect([vcMock presentViewController:OCM_ANY animated:YES completion:nil]).andDo(^(NSInvocation *invocation) { 

     UINavigationController *nav = nil; 
     [invocation getArgument:&nav atIndex:2]; 

     CustomVC *custom = nav.viewControllers.firstObject; 

     // Assert 
     XCTAssertNotNil(nav); 
     XCTAssertTrue([nav isKindOfClass:[UINavigationController class]]); 
     XCTAssertEqual(nav.viewControllers.count, 1); 
     XCTAssertNotNil(custom); 
     XCTAssertTrue([custom isKindOfClass:[CustomVC class]]); 
     XCTAssertEqual(custom.name, expectedName); 

     [exp fulfill]; 
    }); 

    // Act 
    [sut presentWithString:expectedName]; 

    // Assert 
    [self waitForExpectationsWithTimeout:1 handler:nil]; 
    OCMVerifyAll(vcMock); 

    // Cleanup 
    [vcMock stopMocking]; 
} 

此代碼檢查這種情況發生在你的方法一切 - 一個方法得到了調用特定的參數,這其中的第一個論據是導航控制器僅嵌入CustomVC,並且此CustomVC已設置name。顯然我做了假設vc被測試類的屬性可以從外部設置,nameCustomVC可以被讀取。如果不是,測試這個部分可能會更棘手。

個人我不會單元測試這個。我會分別測試CustomVC的初始化,並將整個演示文稿置於UI測試中。

讓我知道,如果一切都清楚!

-

邊注:我寫這在移動從內存中,所以有可能是在代碼中的小失誤。當我有機會使用Xcode進行檢查時,我會更新它。

+0

謝謝,它的工作原理。但是當我嘗試編寫單獨的函數和測試時,結果是[OCMockObject dealloc]錯誤。你能否更新你的答案並寫出創建函數和測試的正確方法? – elektricni

+1

我已經表達了我的觀點 - 我不會單元測試這種方法。看來這應該是由於用戶互動而發生的,對嗎?如果是這樣,它就屬於UI測試IMO。至於ubit測試,我只測試'CustomVC'初始化程序。 – Losiowaty