Тестирование метода контроллера с OCMock и Core Data

Я просто понимаю концепции 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];
}

Я пытаюсь написать два метода тестирования, чтобы проверить это: один, который проверяет сценарий, в котором управляемый объект не может быть сохранен, и один, где он успешно сохраняет.

@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, я не уверен насчет аспектов Core Data всего этого.

Я думаю, что я на правильном пути, но я мог бы использовать второе мнение о том, как решать свои проблемы, и указать правильный путь для тестирования фрагмента кода.

Ответы на вопрос(2)

Ваш ответ на вопрос