Я просто разбираюсь в концепциях TDD и насмехается, и я сталкиваюсь с проблемой с точки зрения правильности. У меня есть лист, который падает и позволяет пользователю создать новый основной объект данных и сохранить его в хранилище данных. Я не уверен, что я использую лучший подход к его тестированию.Метод тестирования контроллера с данными OCMock и Core
- (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];
}
Я пытаюсь написать два метода испытания, чтобы проверить это: тот, который тестирует сценарий, когда управляемый объект не может спасти и один, где он успешно экономит.
@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 выглядит неправильно. В идеале я думаю, что я должен заглушить метод
save:
и вернуть ДА или НЕТ, но с учетом вопроса 1 Я не уверен в аспектах основных данных.
Я думаю, что я на правильном пути, но я мог бы использовать второе мнение о том, как решить мои проблемы и поставить меня на правильный путь для тестирования фрагмента кода.