Тестирование NSDocument

Я только начинаю с модульного тестирования, и мне интересно, как правильно протестировать подкласс NSDocument?

В моем тестовом наборе я могу инициировать документ, но это не отражает, как документ настроен, когда он используется приложением, в частности, соединения IBOutlet не выполняются, а критические сообщения, такие как - (void)windowControllerDidLoadNib:(NSWindowController *)aController не называются.

Итак, как правильно получить полностью инициализированный объект NSDocument для использования в тестировании?

1 ответ

Вот как вы можете начать:

#import <Cocoa/Cocoa.h>
#import <XCTest/XCTest.h>
#import "Document.h"

@interface DocumentTests : XCTestCase {
  Document *document;
  NSWindowController *controller
}
@end

@implementation DocumentTests

- (void)setUp {
  document = [[Document alloc] init];
  [document makeWindowControllers];
  controller = (NSWindowController *)[document windowControllers][0];
}

- (void)testLoadingWindow
{
  XCTAssertNotNil(controller.window);
}

- (void)testTextFieldOutletsIsConnected
{
  [controller window];  //kick off window loading
  XCTAssertNotNil(document.textField);
}
  //For asynchronous testing use XCTestExpectation
  //[self expectationWithDescription:@"Expectations"];
  //[self waitForExpectationsWithTimeout:3.0 handler:nil];

Правильный подход: не помещайте какие-либо элементы пользовательского интерфейса в ваш документ (windowControllerDidLoadNib), если вы хотите его протестировать. Единственная ответственность. Как? Просто реализуйте makeWindowControllers

- (void)makeWindowControllers
{
  CustomWindowController *controller = [[CustomWindowController alloc] init];
  [self addWindowController:controller];
}

Из оконного контроллера вы можете получить доступ к вашему документу в любое время

- (CustomDocument *)document
{
  return [self document];
}
Другие вопросы по тегам