1

単体テストを始めたばかりで、NSDocument サブクラスを正しくテストする方法を知りたいですか?

私のテスト セットアップでは、ドキュメントを初期化できますが、アプリで使用されるときにドキュメントがどのようにセットアップされるかを反映していません。具体的には、IBOutlet 接続が行われず、- などの重要なメッセージ(void)windowControllerDidLoadNib:(NSWindowController *)aControllerが呼び出されません。

では、テストで使用するために完全に初期化された NSDocument オブジェクトを取得する正しい方法は何でしょうか?

4

1 に答える 1

0

これはあなたが始めることができる方法です:

#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) に UI 要素を入れないでください。単一の責任。どのように?makeWindowControllers を実装するだけ

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

ウィンドウコントローラーからいつでもドキュメントにアクセスできます

- (CustomDocument *)document
{
  return [self document];
}
于 2015-09-01T18:30:03.493 に答える