我发现Xcode 7(版本7.0(7A220))改变了+load在单元测试期间调用类和类别的方法的顺序.
如果属于测试目标的类别实现了一个+load方法,那么现在可以在最后调用它,此时类的实例可能已经被创建和使用.
我有一个AppDelegate实现+load方法.该AppDelegate.m文件还包含AppDelegate (MainModule)类别.此外,还有一个单元测试文件LoadMethodTestTests.m,其中包含另一个类别 - AppDelegate (UnitTest).
这两个类别也实现了+load方法.第一类属于主要目标,第二类属于测试目标.
我做了一个小测试项目来证明这个问题.它是一个空的默认Xcode一个视图项目,只更改了两个文件.
AppDelegate.m:
#import "AppDelegate.h"
@implementation AppDelegate
+(void)load {
NSLog(@"Class load");
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"didFinishLaunchingWithOptions");
return YES;
}
@end
@interface AppDelegate (MainModule)
@end
@implementation AppDelegate (MainModule)
+(void)load {
NSLog(@"Main Module +load");
}
@end
Run Code Online (Sandbox Code Playgroud)
和一个单元测试文件(LoadMethodTestTests.m):
#import <UIKit/UIKit.h>
#import <XCTest/XCTest.h>
#import "AppDelegate.h"
@interface LoadMethodTestTests : XCTestCase
@end
@interface AppDelegate (UnitTest) …Run Code Online (Sandbox Code Playgroud) 我曾经问过一个与XCTests有关的问题。在一个答案中,我被告知,在运行单元测试(至少在iOS开发中)时,使用单独的测试目标(主应用程序除外)是一种常见的做法。我试图找到一些有关它的资料,但是我找不到
我了解,这可能是最佳做法,所以我很想了解。有人可以向我解释为什么它很重要,我从中得到什么好处,我应该如何去做呢?指向一些解释该问题的文章的链接将不胜感激。
PS我知道我需要特殊的测试环境(虚拟内存数据库,模拟的网络层等),但是直到现在,我仍设法在没有单独的测试主机的情况下实现它。但我相信可能会有更好的方法。