gpt4 book ai didi

objective-c - 使用 OCMock 和 Core Data 测试 Controller 方法

转载 作者:搜寻专家 更新时间:2023-10-30 19:47:16 26 4
gpt4 key购买 nike

我刚刚掌握了 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

以下是我知道自己遇到但不确定如何解决的问题:

  1. 我不确定如何根据测试处理托管对象上下文。我应该调出整个核心数据堆栈还是只创建一个 NSManagedObjectContext 的模拟?
  2. 仅将文本字段值设置为触发 if 语句的方式的想法似乎是错误的。理想情况下,我认为我应该删除 save: 方法并返回 YES 或 NO,但对于问题 1,我不确定这一切的核心数据方面。

我认为我走在正确的轨道上,但我可以就如何解决我的问题并让我走上测试代码片段的正确道路征求意见。

最佳答案

贾斯汀,

我对问题 #1 所做的是创建一个实际的 NSManagedObjectContext 但创建一个内存持久性存储。什么都没有打到磁盘,我测试了 CoreData 版本的真相。

我有一个 MWCoreDataTest 类(在我的案例中是 GTMTestCase 的扩展),它构建了 moc 并初始化了持久性存储

    - (NSManagedObjectContext *) managedObjectContext {

if (managedObjectContext != nil) {
return managedObjectContext;
}

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
}

return managedObjectContext;
}



- (NSPersistentStoreCoordinator*)persistentStoreCoordinator;
{
if (persistentStoreCoordinator) return persistentStoreCoordinator;
NSError* error = nil;
NSManagedObjectModel *mom = [self managedObjectModel];
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:mom];


if (![persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType
configuration:nil
URL:nil
options:nil
error:&error]) {
[[NSApplication sharedApplication] presentError:error];
return nil;
}
return persistentStoreCoordinator;
}

WRT #2,我认为没关系 - 如果您计划在类里面测试不止一种行为,请移动

[addItemWindowController setValue:mockNameField forKey:@"itemNameTextField"];

到 testAdding.. 方法

如果您解决了 #1,那么您只需将 itemNameText 字段设置为 nil 即可触发您的保存验证。

WRT #3,我会验证在 NSApp 上构建模拟 === 在 NSApplication 上构建模拟

关于objective-c - 使用 OCMock 和 Core Data 测试 Controller 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2267757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com