我想做一个应用程序测试,解析一些json,存储到核心数据,并读出一些对象。
我的代码如何知道它是作为测试或正常运行的一部分运行的?只是某种方式知道“我们是否在测试目标中”?因为应用程序启动它现在启动了一堆请求,用服务器中的信息填充我的coredata。我不希望它在我的测试中这样做。我想启动应用程序,从文件中读取HARDCODED json并使用与coredata相同的方法存储它,并验证结果。
如果有人可以解释如何在每个目标的基础上传递特定的键值对,可以从应用程序中读取,我会更高兴。
答案 0 :(得分:34)
没关系......想出你在“方案”中设置了它。
例如,如果您希望TARGET = TEST在测试期间可用而TARGET = RUN在运行期间显示,则只需在Scheme>中设置它即可。环境变量>名称/值。
然后,您可以从您的应用中执行以下操作:
[[[NSProcessInfo processInfo] environment] objectForKey:@"TARGET"]
使用预处理器宏的构建设置DID不适用于我b / c我的测试目标(用于应用程序/集成测试)取决于我的主(非测试)目标,因此主要目标是首先构建的,这是运行的,并且你最终得到了主目标预处理器宏,即使你是在你运行的目标中定义的宏之后。如果我在这里遗漏了某些东西,请随时解释。
答案 1 :(得分:10)
如果“测试目标”是指您的单元测试(即Product > Test
或⌘U
),则可以向目标添加预处理器宏并在代码中检查该宏。这允许类似以下内容:
#ifdef TEST
// Load the hard-coded data.
#else
// Load data from the server.
#endif
要执行此操作,请在项目导航器中单击项目文件,选择测试目标,单击Build Settings
选项卡,搜索“宏”,双击Preprocessor Macros
选项,然后添加一个!
答案 2 :(得分:6)
有两种情况需要处理:
Tests
,则运行一些代码,#import
某些目标的某些文件,例如Tests
。测试目标的目标代码:
在ProjectName-Prefix.pch
文件中创建一个宏,如下所示:
#define IsTestTarget [[[[NSProcessInfo processInfo] environment][@"XCInjectBundle"] pathExtension] isEqualToString:@"xctest"]
然后在应用中的任意位置调用它:
if (IsTestTarget) {
//Do something specific for test target;
} else {
//Otherwise do something else
}
条件#import
:
选择#import
目标后,若要Tests
某些文件,您需要向Preprocessor Macro
目标添加Test
并将其用作:
#ifdef APPTESTS
#import "TestSpecificFile.h"
#else
#import "SomeOtherFile.h"
#endif
以下是添加Preprocessor Macro
的方法:
答案 3 :(得分:5)
您可以使用以下功能。
+(BOOL) isRunningTests
{
NSDictionary* environment = [[NSProcessInfo processInfo] environment];
NSString* injectBundle = environment[@"XCInjectBundle"];
return [[injectBundle pathExtension] isEqualToString:@"xctest"];
}
答案 4 :(得分:0)
通常在单元测试中,程序员使用模拟类和功能。 您可以为测试目标创建一个目标成员资格仅的类。
@interface MockClass : NSObject
@end
然后在应用程序代码中,您可以使用NSClassFromString
函数检查类是否存在(对于未包含在类的目标成员资格中的目标,将返回Nil
,在本例中为非测试目标。
if (NSClassFromString(@"MockClass")) {
//Test Target
} else {
//App Target
}
你可以诅咒它的功能
BOOL isUnitTest(){
return NSClassFromString(@"MockClass") != Nil;
}