mobincube buttons ios mocking xctest

ios - buttons - mobincube



xctest: cómo probar si una nueva vista se carga con un botón (2)

Acabo de iniciar xcode 5 y xctest. ¿Cómo pruebo que una vista se carga al presionar un botón? Tengo método agregado programáticamente que se llama cuando se hace clic en el derechoBarButtonItem

action:@selector(onSettingsButton)

y en onSettingsButton

-(void) onSettingsButton{ SettingsViewController *svc = [[SettingsViewController alloc] init]; [self.navigationController pushViewController:svc animated:YES]; }

¿Cómo escribir xctest para asegurar que SettingsViewController abre la vista de Configuraciones? Gracias.


Necesita una prueba de interacción, es decir, una prueba que verifique las interacciones entre los objetos. En este caso, desea probar que se -pushViewController:animated: en el controlador de navegación con un SettingsViewController . Así que queremos poner un objeto de simulación en self.navigationController que podemos preguntar: "¿Te llamaron como esperabas?"

Asumiré un nombre simple para la clase: MyView.

La forma en que haría esto a mano es Subclasificar y Anular navigationController . Entonces, en mi código de prueba, haría algo como esto:

@interface TestableMyView : MyView @property (nonatomic, strong) id mockNavigationController; @end @implementation TestableMyView - (UINavigationController *)navigationController { return mockNavigationController; } @end

Ahora, en lugar de crear MyView, la prueba creará un TestableMyView y establecerá su propiedad mockNavigationController .

Este simulacro puede ser cualquier cosa, siempre que responda a -pushViewController:animated: y registre los argumentos. Aquí hay un ejemplo simple, a mano:

@interface MockNavigationController : NSObject @property (nonatomic) int pushViewControllerCount; @property (nonatomic, strong) UIViewController *pushedViewController; @property (nonatomic) BOOL wasPushViewControllerAnimated; @end @implementation MockNavigationController - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { self.pushViewControllerCount += 1; self.pushedViewController = viewController; self.wasPushViewControllerAnimated = animated; } @end

Finalmente, aquí hay una prueba:

- (void)testOnSettingsButton_ShouldPushSettingsViewController { // given MockNavigationController *mockNav = [[MockNavigationController alloc] init]; TestableMyView *sut = [[TestableMyView alloc] init]; sut.mockNavigationController = mockNav; // when [sut onSettingsButton]; // then XCTAssertEquals(1, mockNav.pushViewControllerCount); XCTAssertTrue([mockNav.pushedViewController isKindOfClass:[SettingsViewController class]]); }

Estas cosas se pueden simplificar mediante el uso de marcos de objetos simulados como OCMock, OCMockito o la burla de Kiwi. Pero creo que ayuda empezar primero con la mano, para que entiendas los conceptos. Luego elige las herramientas que ayudan. Y si sabes cómo hacerlo a mano, nunca dirás: "¡Mocking Framework X no hace lo que necesito! ¡Estoy atascado!"


Encontrado de una manera. Tal vez hay otros ...

- (void)testSettingsViewShowsWhenSettingsButtonIsClicked{ [self.tipViewController onSettingsButton]; id temp = self.tipViewController.navigationController.visibleViewController; XCTAssertEqual([temp class], [SettingsViewController class], @"Current controller should be Settings view controller"); }

Primero llama al onSettingsButton, que es lo mismo que hacer clic en el botón, pero no realmente. ¿Tal vez está bien para este simple caso de prueba? Cómo simular la prensa real?

A continuación, obtenga la vista actual desde tipviewcontoller, que es la vista de raíz de la aplicación y verifique que sea un SettingsViewController.