如何单元测试实例方法 - 目标C.

时间:2016-05-25 19:23:34

标签: objective-c unit-testing

我希望以正确的方式构建我的单元测试,并且想知道如何在将对象传递给方法时测试类方法

所以问题的方法(基本例子)

MyClient.m:

#import "MyClient.h"

@interface MyClient()
  @property (nonatomic, strong) MyMedia *myMedia;
@end

- (void)setMedia:(MyMedia *)media {
    self.MyMedia = media;
     int var;
    if (media && media.isLive) {
      var = 1;
    }
    else {
      var = 2;
    }
  }
}

所以在这个例子中我会创建两个测试,1如果media.isLive测试var是2,如果不是,则测试var是2。

希望这是有道理的

由于

1 个答案:

答案 0 :(得分:0)

您的代码不是真正可测试的,因为您需要检查的所有内容都是私有的。虽然有很多方法可以使用运行时和测试内容来“破解”类,但您真的只想利用类的公共访问接口。所以我重写了这样的代码:

MyClient.h

@interface MyClient:NSObject 
    @property (nonatomic, strong) MyMedia *myMedia;
    @property (nonatomic, assign, readonly) int var;
@end

MyClient.m

#import "MyClient.h"

@implementation MyClient

- (void)setMedia:(MyMedia *)media {
    _MyMedia = media;
    _var = media && media.isLive ? 1 : 2;
}

@end

现在让我们使用XCTest进行一些测试。

MyClientTests.m

@import XCTest;
#import "MyClient.h"

@interface MyClienTests:XCTestCase
@end

@implementation MyClientTests {
    MyClient *_myCLient;
    MyMedia *_media;
}

-(void) setUp {
    _myClient = [[MyClient alloc] init];
    _media = [[MyMedia alloc] init];
}

-(void) testMyClientMediaIsAlive {
    _media.alive = YES;
    _myClient.media = _media;
    XCTAssertEqual(1, _myClient.var);
}

-(void) testMyClientMediaIsNotAlive {
    _myClient.media = _media;
    XCTAssertEqual(2, _myClient.var);
}

-(void) testMyClientNoMedia {
    XCTAssertEqual(2, _myClient.var);
}

@end