私はTDDとモッキングの概念を把握しているだけで、適切に行う方法に関して問題に直面しています。ドロップダウンを使用して、ユーザーが新しいコア データ オブジェクトを作成し、それをデータ ストアに保存できるようにするシートがあります。テストに最善のアプローチを取っているかどうかはわかりません。
- (IBAction)add:(id)sender
{
NSString *itemName = [self.itemNameTextField stringValue];
SGItem *newItem = [NSEntityDescription insertNewObjectForEntityForName:kItemEntityName inManagedObjectContext:[self managedObjectContext]];
newItem.name = itemName;
NSError *error = nil;
BOOL canSaveNewItem = [[self managedObjectContext] save:&error];
if (!canSaveNewItem)
{
[NSApp presentError:error];
}
[self clearFormFields]; // Private method that clears text fields, disables buttons
[NSApp endSheet:[self window] returnCode:NSOKButton];
}
これをテストするために、2 つのテスト メソッドを作成しようとしています。
@interface SGAddItemWindowControllerTests : SGTestCase
{
@private
SGAddItemWindowController *addItemWindowController;
id mockApp;
id mockNameField;
}
- (void)setUp
{
mockNameField = [OCMockObject mockForClass:[NSTextField class]];
mockApp = [OCMockObject mockForClass:[NSApplication class]];
addItemWindowController = [[BLAddItemWindowController alloc] init];
[addItemWindowController setValue:mockNameField forKey:@"itemNameTextField"];
}
- (void)testAddingNewItemFromSheetFailed
{
// Setup
NSString *fakeName = @"";
[[[mockNameField expect] andReturn:fakeName] stringValue];
[[mockApp expect] presentError:[OCMArg any]];
// Execute
[addItemWindowController add:nil];
// Verify
[mockApp verify];
}
- (void)testAddingNewItemFromSheetSucceeds
{
// Setup
NSString *fakeName = @"Item Name";
[[[mockNameField expect] andReturn:fakeName] stringValue];
[[mockApp expect] endSheet:[OCMArg any] returnCode:NSOKButton];
// Execute
[addItemWindowController add:nil];
// Verify
[mockApp verify];
[mockNameField verify];
}
@end
以下は、私が抱えていることがわかっている問題ですが、解決方法がわかりません。
- テストに関して管理対象オブジェクトのコンテキストを処理する方法がわかりません。コア データ スタック全体を表示するか、単にモックを作成する必要があり
NSManagedObjectContext
ますか? - if ステートメントをトリガーする方法としてテキスト フィールドの値を設定するという考えは間違っているようです。理想的には、メソッドをスタブアウトして YES または NO を返す必要があると思います
save:
が、質問 1 を考えると、すべてのコア データの側面について確信が持てません。
私は正しい方向に進んでいると思いますが、問題に対処する方法についてセカンドオピニオンを使用し、コード スニペットをテストするための正しい道筋を立てることができます。