Tag: ocmock

存根初始化]不工作,但接受的答案说,它应该工作

我的testingfunction非常简单: @implementation MyHandler … -(void) processData { DataService *service = [[DataService alloc] init]; NSDictionary *data = [service getData]; [self handleData:data]; } @end 我使用OCMock 3来进行unit testing。 我需要存根 [[DataService alloc] init]返回一个模拟实例 ,我试图从这个问题 (这是一个接受的答案)的答案存根[[SomeClazz alloc] init] : // Stub 'alloc init' to return mocked DataService instance, // exactly the same way as the accepted answer told id DataServiceMock […]

如何使用核心数据进行dependency injection

我玩弄使用核心数据来pipe理对象的graphics,主要是为了dependency injection(NSManagedObjects的一个子集需要被持久化,但这不是我的问题的焦点)。 当运行unit testing时,我想要接pipeNSManagedObjects的创build,用mockreplace它们。 我现在有一个候选的方法,就是使用运行时的method_exchangeImplementations来交换[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]与我自己的实现(即返回模拟)。 这适用于我已经完成的一个小testing。 我有两个问题: 有没有更好的方式来replace核心数据的对象创build比swizzling insertNewObjectForEntityForName:inManagedObjectContext? 我没有进入运行时或核心数据,可能会漏掉一些明显的东西。 我的replace对象创build方法的概念是返回嘲笑的NSManagedObjects。 我使用的OCMock,它不会直接模拟NSManagedObject子类,因为它们的dynamic@property s。 现在我的NSManagedObject的客户端正在与协议而不是具体的对象交stream,所以我返回了嘲讽的协议而不是具体的对象。 有没有更好的办法? 这里有一些伪装的代码来说明我所得到的。 这是我可能要testing的一个类: @interface ClassUnderTest : NSObject – (id) initWithAnObject:(Thingy *)anObject anotherObject:(Thingo *)anotherObject; @end @interface ClassUnderTest() @property (strong, nonatomic, readonly) Thingy *myThingy; @property (strong, nonatomic, readonly) Thingo *myThingo; @end @implementation ClassUnderTest @synthesize myThingy = _myThingy, myThingo = _myThingo; – (id) […]

在unit testing中,使用dispatch_asyc执行队列中传递的块

如果我dispatch_async在主队列上的一块像这样: -(void) myTask { dispatch_async(dispatch_get_main_queue(), ^{ [self.service fetchData]; }); } 在unit testing中,我可以通过手动运行主循环来执行主队列中传递的块: -(void)testMyTask{ // call function under test [myObj myTask]; // run the main loop manually! [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; // now I can verify the function 'fetchData' in block is called … } 现在,我有另一个类似的function,将块分派到主队列以外的连续队列: -(void) myTask2 { dispatch_async(dispatch_queue_create("my.sequential.queue", NULL), ^{ [self.service fetchData]; }); } […]

OCMock和块testing,执行

以下是testing中的方法: – (void)loginWithUser:(NSString *)userName andPass:(NSString *)pass { NSDictionary *userPassD = @{@"user":userName, @"pass":pass}; [_loginCntrl loginWithUserPass:userPassD withSuccess:^(NSString *authToken){ // save authToken to credential store } failure:^(NSString *errorMessage) { // alert user pass was wrong }]; } 我想testing的是,在成功块中的其他依赖/ OCMockObject _credStore被调用适当的方法。 所以目前loginCtrl和credStore的依赖关系是OCMockObjects,我可以对这些存根/期望。 我将存根loginController以某种方式执行该块时调用? 我已经看了一些与OCMock有关的残块的问题,我不能把我的头围绕在他们正在做的事情上,是否适合这种情况。 实际上,我想要做的就是OCMock来启动块([成功调用] ??),以便代码_credStore saveUserPass完成并可以在_credStore上进行validation。 我停下来的地方: – (void)test_loginWithuserPass_succeeds_should_call_credStore_setAuthToken { NSDictionary *userPassD = @{@"user":@"mark", @"pass":@"test"}; id successBlock = […]

EXC_BAD_ACCESS在访问OCMock的andDo参数时

我正在尝试使用OCMock的stub和Do方法编写一段代码。 在这种情况下,正在testingUIImageView扩展类。 我想检查扩展调用[self setImage:]参数是非零(稍后将使用其他图像比较)。 在使用OCMock的andDo方法时,在块完成后,testing会使用EXC_BAD_ACCESS进行崩溃。 id mockView = [OCMockObject mockForClass:[UIImageView class]]; [[[mockView stub] andDo:^(NSInvocation *invocation) { UIImage *img; [invocation getArgument:&img atIndex:2]; <—- line causing the exception somebodySetImage |= (img != nil); }] setImage:OCMOCK_ANY]; [mockView do_something_that_calls_setImage]; 我现在发现的唯一解决scheme是使用andCall而不是andDo ,但这使testing变得复杂。 我可以用andDo避免崩溃吗? 更新那么,我将尝试在这里给出一个更好的例子:这是testing代码的新部分: – (void)testDownloadingThumbnail { PInfo *_sut = [[PInfo alloc] init]; __block id target = nil; id mock […]

调用时XCTest失败

我有一些代码,在某些时候调用[NSBundle mainBundle] ,主要是读取/设置首选项。 当我unit testing的方法,testing失败,因为testing的mainBundle不包含该文件。 这是一个已知的问题 ,苹果不会因为他们认为它不是一个bug而修复 : 他们答复的要点是XCTest通过返回它自己的主包而不是testing目标包来正常工作。 以前我们的代码是在NSBundle的+mainBundle类方法上使用类别重写来解决这个问题。 但是这是很危险的,因为覆盖类别中现有方法的行为是未定义的 。 如果在类别中声明的方法的名称与原始类中的方法相同,或者在同一个类(甚至是超类)上的另一个类中的方法相同,则行为是不确定的运行。 实际上Xcode提醒你: 类正在实现一个方法,也将由其主要类实现 那么,解决这个问题的正确方法是什么呢?

你如何嘲笑iOS的OCMock的私人财产?

我有一个在我的类的.m文件中声明的私有属性被testing,我们称之为ClassUnderTest。 ClassUnderTest实例化ClassToBeMocked的一个实例。 我如何使用OCMock模拟出一个ClassToBeMocked的实例并将它分配给ClassUnderTest?

如何unit testing一个NSURLConnection委托?

我怎样才能unit testing我的NSURLConnection委托? 我做了一个ConnectionDelegate类,它符合不同的协议,以便将来自Web的数据提供给不同的ViewController。 在我太远之前,我想开始写我的unit testing。 但是我不知道如何testing他们作为一个单位没有互联网连接。 我也想我应该做什么来处理asynchronouscallback。

OCMock可以运行块参数吗?

假设一个方法签名,如下所示: – (void)theMethod:(void(^)(BOOL completed))completionBlock; 我想嘲笑这个方法签名,以确保该方法被调用,只是调用完成块。 我从其他职位看到这样的一个 ,我可以嘲笑方法调用,并接受任何块,但不运行该块。 我也知道有一个andDo方法可以使用,但我不知道如何传递一个块并运行它。 有任何想法吗? 谢谢。

unit testingparsing框架iOS

我正在尝试为使用Parse后端框架的iOS应用程序编写unit testing,而且在编写成功的unit testing之后,大量的实验似乎都失败了。 我在testingasynchronous代码( 在iOS中testingunit testing中的asynchronous调用 )和testingnetworking调用方面发现了一些post,但是还没有find用asynchronouscallbacktesting对Parse后端调用的方法。 举个例子,任何人都可以build议我如何testing下面这行代码: [PFUser saveUser:userModelMock withBlock:^(BOOL success, NSError *error) { }]; 我正在使用OCMock和XCTest框架。 任何帮助将非常感激。 *编辑*这是我迄今为止,但似乎失败 – (void)testSaveUser { id userModelMock = [OCMockObject niceMockForClass:[UserModel class]]; id userControllerMock = [OCMockObject niceMockForClass:[self.userController class]]; [[userModelMock expect] saveInBackgroundWithBlock:[OCMArg any]]; [[userControllerMock stub] saveUser:userModelMock withBlock:[OCMArg any]]; [userModelMock verify]; }