Xcode 자체가 테스트를 실행할 때 환경 변수를 설정하므로 스키마에서 아무 것도 만들 필요가 없습니다. 이미 다른 목적으로 그렇게하고 있다면 그렇게하는 것이 실용적 일 수 있습니다. 그러나 테스트 실행 여부를 결정하기 위해 Xcode의 환경 변수를 사용할 수 있습니다.
옵션 1 :
static BOOL isRunningTests(void) __attribute__((const));
static BOOL isRunningTests(void)
{
NSDictionary* environment = [[NSProcessInfo processInfo] environment];
NSString* injectBundle = environment[@"XCInjectBundle"];
NSLog(@"TSTL %@", [injectBundle pathExtension]);
return [[injectBundle pathExtension] isEqualToString:@"xctest"] || [[injectBundle pathExtension] isEqualToString:@"octest"];
}
그리고 단순히 전화 isRunningTests()
당신이 테스트를 확인해야 할 때마다 코드의 대부분은 앱 위임에 던질 수있는 objc에서이처럼 보인다. 이 코드는, 그러나, 정말 TestHelper 클래스, 예를 들어, 다른 곳에 저장해야합니다
옵션 2 :
우리는 여전히 글로벌 변수를 사용하는
// TestHelper.h
#import <Foundation/Foundation.h>
extern BOOL isRunningTests(void) __attribute__((const));
// TestHelper.m
#import "TestCase.h"
extern BOOL isRunningTests(void)
{
NSDictionary* environment = [[NSProcessInfo processInfo] environment];
NSString* injectBundle = environment[@"XCInjectBundle"];
NSLog(@"TSTL %@", [injectBundle pathExtension]);
return [[injectBundle pathExtension] isEqualToString:@"xctest"] || [[injectBundle pathExtension] isEqualToString:@"octest"];
}
주 , 그리고 클래스 이름의 선택은 실제로 부적합하다. 그것을 유지하는 것이 의미가있는 클래스입니다.
옵션 3 :
그리고 빠른에, 당신은 목표 - C와 신속한 모두에서 작동하기 위해 클래스에 포장해야합니다. 이처럼 할 수있는 :
class TestHelper: NSObject {
static let isRunningTests: Bool = {
guard let injectBundle = NSProcessInfo.processInfo().environment["XCInjectBundle"] as NSString? else {
return false
}
let pathExtension = injectBundle.pathExtension
return pathExtension == "xctest" || pathExtension == "octest"
}()
}
좋은 해결책입니다. 감사! –
솔루션을 제공해 주셔서 감사합니다. 나는 그것을 정말로 좋아하고 항상 그것을 사용한다. 나는 작은 개선 (또는 그렇게 생각한다)을 생각해 냈다. 내 대답을 한번 보게되면 기뻐할거야. 어쩌면 당신은 똑같은 것을 달성하는 더 좋은 방법을 안다. 아니면 내 생각을 좋아할 수도 있습니다 :) – FreeNickname
그럼 왜 안되겠습니까? 나는 appdelegate를 조롱하는 것이 도움이 될 것이라고 제안한다. –