- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在单元测试中使用 OCMock 来模拟 NSManagedObjects。我使用 Mogenerator 为我的核心数据对象生成机器和人类可读的文件。我试图模拟 NSManagedObject 以返回 bool 值和字符串。两者都是我的核心数据实体的属性。当我模拟 BOOL
时,该值从对象正确返回,我的类使用它,并且测试成功通过。当我尝试在同一对象上 stub NSString
属性时,它会抛出 NSInvalidArgumentException [NSProxy doesNotRecognizeSelector]
。
调用代码如下:
id biller = [OCMockObject mockForClass:[Biller class]];
// passes
[[[biller stub] andReturnValue:OCMOCK_VALUE((BOOL){NO})] billerValidatedValue];
// throws exception
[[[biller stub] andReturn:@"Test"] name];
这是一个异常(exception):
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSProxy doesNotRecognizeSelector:name] called!'
我知道有some recommendations为了测试目的,有一个位于 NSManagedObject 前面的接口(interface),但这似乎增加了 Mogenerator 机器/人类文件之上的复杂性。
在不完全重新配置此代码的情况下,还有其他建议吗?该代码已经投入生产,我们正在尝试在开发新功能时添加单元测试。
最佳答案
问题的关键是您的核心数据模型在测试中不可用,因此当您尝试对读取的属性进行 stub 时,该方法不存在。 Core Data 在运行时动态拦截属性访问器。
要使模型可用,您需要确保 .xcdatamodeld 包含在单元测试目标中,并且需要在测试中设置模型。我不确定您是否能够模拟动态属性,但在测试中对 Core Data 对象执行 CRUD 操作变得微不足道,因此无需模拟它们。以下是在测试中初始化模型的一种方法:
static NSManagedObjectModel *model;
static NSPersistentStoreCoordinator *coordinator;
static NSManagedObjectContext *context;
static NSPersistentStore *store;
-(void)setUp {
[super setUp];
if (model == nil) {
@try {
NSString *modelPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"my-model" ofType:@"mom"];
NSURL *momURL = [NSURL fileURLWithPath:modelPath];
model = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
}
@catch (NSException *exception) {
NSLog(@"couldn't get model from bundle: %@", [exception reason]);
@throw exception;
}
}
coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
NSError *error;
store = [coordinator addPersistentStoreWithType: NSInMemoryStoreType
configuration: nil
URL: nil
options: nil
error: &error];
assertThat(store, isNot(nil));
context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:coordinator];
}
-(void)tearDown {
// these assertions ensure the test was not short-circuited by a failure to initialize the model
assertThat(model, isNot(nil));
assertThat(context, isNot(nil));
assertThat(store, isNot(nil));
assertThat(coordinator, isNot(nil));
NSError *error = nil;
STAssertTrue([coordinator removePersistentStore:store error:&error],
@"couldn't remove persistent store: %@", [error userInfo]);
[super tearDown];
}
或者,您可以使用 MagicalRecord 来显着简化事情。 。即使您不在应用程序中使用它,您也可以在测试中使用它来封装所有核心数据设置。这是我们的单元测试设置在使用 MagicalRecord 的应用程序中的样子:
-(void)setUp {
[super setUp];
[MagicalRecordHelpers setupCoreDataStackWithInMemoryStore];
}
-(void)tearDown {
[MagicalRecordHelpers cleanUp];
[super tearDown];
}
关于cocoa - 带有 Core Data/Mogenerator 的 OCMock 抛出异常 NSInvalidArgumentException [NSProxy doesNotRecognizeSelector],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12697058/
我有一个 iOS 应用程序,我正在尝试将 OCMock 添加到其中,以便更好地对其进行单元测试。我已经按照 ocmock.org 上的说明以及我在其他地方找到的说明进行操作,但仍然无法编译我的测试代码
我正在使用 OCMock 来帮助我正在使用 Xcode 为 iPad 应用程序进行的测试驱动开发。我有这样的测试代码: id mock = [OCMockObject mockForProtocol:
在使用 OCMock 框架编写单元测试时,我遇到了一些具体的问题。 假设我有一些带有一个参数的方法。我需要的是 stub 该方法并返回相同的值。该值是计算出来的,所以我不能只通过通常的 stub 返回
我正在尝试为我创建的简单 UIDevice 类别设置一些测试用例。 由于这些方法是实例方法,因此我创建了一个模拟来模拟 currentDevice 行为。 添加的方法基于 name 属性,因此我创建了
我正在使用 OCMock 来测试从 Storyboard 中实例化的 UIViewController。遵循最佳实践, View Controller View 的 subview 的所有 IBOut
我这样设置模拟观察者: id quartileObserverMock = [OCMockObject observerMock]; [[NSNotificationCenter defaultCen
我有一个测试(使用 OCMock)验证在发送特定通知时调用了一个方法: - (void)testThatVCRegistersToLocationUpdateNotification { Is
我想使用 OCMock 这样,无论何时使用任何参数调用 someMethod,它都会调用带有参数“dict”的 callBackMethod:,这是一个 NSDictionary。我找到了 andCa
我一直在使用 OCMock 创建 stub 和模拟。不过,我正在努力模拟本地声明的对象方法。 如果我有下面的代码: // Example.m #import "Object.h" - (NSStrin
我做了一个部分模拟,一个测试按预期运行,但对于第二个测试,它连续调用 setUp 和 teardown 而没有调用实际测试。 - (void)setUp { [super setUp]; _r
我正在尝试在我们的大型项目中设置一些单元测试。问题是某些 ViewController 在调用部分模拟崩溃时会出现以下跟踪: error: -[EspionageViewControllerTests
当我们用OCMock创建一个模拟对象时,例如 id classMock = OCMClassMock([SomeClass class]); classMock 是后台 SomeClass 的真实对象
我正在加快使用 OCMock 模拟 iOS 的速度。我写了一个简单的模拟单元测试,当它应该失败时——基于我设定的期望——它会通过。 代码如下: // Scientific Calculator cla
我正在尝试模拟一个类方法来识别 iOS 是 iOS 6(或更早版本)还是 iOS 7(或更高版本)。这是测试代码: id iOSDetectorMock = [OCMockObject mockFor
这是一个关于 OCMock 期望的极其基本的问题。让我们在 objectA 上有一个实例方法 methodA,它调用 objectA 上的实例方法 methodB。 - (void)methodA {
我有一个如下签名的方法; - (NSInteger) getFirstVisitTimeStamp; 当我使用 OCMock 模拟并返回一个值时,测试失败并出现以下错误。 [[[[YSNYI13NMo
我终于将一些 TDD 强加到我正在从事的项目中,并且遇到了边缘......我知道我想要的代码但不知道如何测试它:) 我正在寻找的实现是: - (void) doSomething { FooB
我是新来的 OCMock . 我使用 dispatch_once() 创建了一个单例类 MyManager : @implementation MyManager + (id)sharedInstan
我正在尝试为输出取决于 NSDate 的 timeIntervalSinceNow 返回值的方法编写测试。我想在我的测试中指定返回值,以便我可以测试某些场景。 我很难让这个 OCMock 对象返回我想
我是 OCMock 的新用户,所以我可能只是遗漏了一些简单的东西。此代码无法编译: id mockSession = [OCMockObject mockForClass:[AVCaptureSess
我是一名优秀的程序员,十分优秀!