【问题标题】:Passing NSTimer has parameter传递 NSTimer 有参数
【发布时间】:2013-02-28 06:07:02
【问题描述】:

我有一个采用NSTimer 的方法,它的参数在A 类中

-(void)demoMethod:(NSTimer *)timer{
    //Do something!
}

现在我已经覆盖了该方法的测试用例:

-(void)testDemoMethodPassNilTimer{

    //Created class Instance for the ClassA

    ClassA *testA = [[ClassA alloc]init];

    //[test testDemoMethod:nil];

    STAssertThrows([testA testDemoMethod:nil],@"should throw exception");

}

-(void)testDemoMethodPassTimer{

    ClassA *testA = [[ClassA alloc]init];
    STAssertNoThrows([testA testDemoMethod:??????]);
}

为测试用例方法testDemoMethodPassTimer 传递NSTimer 对象的参数的正确方法应该是什么?

【问题讨论】:

  • 是否要传递参数给 NSTimer 以在 demoMethod: 方法中访问?

标签: iphone objective-c unit-testing ocunit


【解决方案1】:

给它一个实际的计时器对象,但不要将它安排在运行循环中。

【讨论】:

    【解决方案2】:

    我也需要将参数解析为 NSTimer。所以我想出了创建类别类,这对我有帮助。

    以下是在 NSTimer 上创建 Category 类的步骤。

    1. 右键单击项目并选择“新建文件”
    2. Cacoa Touch > Objective-C 类别 > 下一步
    3. 给出类别:添加和类别:NSTimer
    4. 在 .h 文件中只需创建 placeId 的属性
    5. 在.m 中使用@dynamic 合成它并创建setter、getter
    6. 将该 .h 文件导入您的文件中。

    NSTimer+additions.h 文件

    #import <Foundation/Foundation.h>
    
    @interface NSTimer (additions)
    
         @property(nonatomic,retain)    NSString  *additionalTag;
    
    @end
    

    NSTimer+additions.m 文件

    #import "NSTimer+additions.h"
    #import <objc/runtime.h>
    
    NSString *const additionalTagKey = @"additionalTagKey";
    
    @implementation NSTimer (additions)
    @dynamic additionalTag;
    
    - (void)setAdditionalTag:(NSString*)aObject
    {
        objc_setAssociatedObject(self, additionalTagKey, aObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    - (NSString*)additionalTag
    {
        return objc_getAssociatedObject(self, additionalTagKey);
    }
    
    @end
    

    现在 #import "NSTimer+additions.h" 在你的课堂上使用 NSTimer

    将参数传递给 NSTimer

    -(void)testDemoMethodPassTimer{
    
        NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                                  target:self
                                  selector:@selector(timerTick:)
                                  userInfo:nil
                                  repeats:YES];
        timer.additionalTag = @"parameter passed to timer";
    
        ClassA *testA = [[ClassA alloc]init];
        STAssertNoThrows([testA testDemoMethod:timer]);
    }
    

    从计时器中检索参数

    -(void)demoMethod:(NSTimer *)timer{
        NSLog(@"My Parameter: %@",timer.additionalTag);
    }
    

    涉及许多步骤,但希望对您有所帮助。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2011-04-30
      • 2014-09-13
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多