Tôi tin rằng hoàn toàn chính đáng khi muốn biết liệu bạn có đang chạy trong một bài kiểm tra hay không. Có rất nhiều lý do tại sao điều đó có thể hữu ích. Ví dụ: trong các thử nghiệm đang chạy, tôi quay lại sớm từ các phương thức khởi chạy ứng dụng đã làm / sẽ-kết thúc trong App Delegate, giúp các thử nghiệm bắt đầu nhanh hơn đối với mã không phải là bài kiểm tra đơn vị của tôi. Tuy nhiên, tôi không thể thực hiện bài kiểm tra "logic" thuần túy, vì nhiều lý do khác.
Tôi đã từng sử dụng kỹ thuật tuyệt vời được mô tả bởi @Michael McGuire ở trên. Tuy nhiên, tôi nhận thấy rằng nó đã ngừng hoạt động đối với tôi xung quanh Xcode 6.4 / iOS8.4.1 (có lẽ nó đã bị hỏng sớm hơn).
Cụ thể là tôi không thấy XCInjectBundle nữa khi chạy thử nghiệm bên trong mục tiêu thử nghiệm cho một khuôn khổ của tôi. Đó là, tôi đang chạy bên trong một mục tiêu thử nghiệm để kiểm tra một khuôn khổ.
Vì vậy, bằng cách sử dụng phương pháp @Fogmeister đề xuất, mỗi lược đồ thử nghiệm của tôi hiện đặt một biến môi trường mà tôi có thể kiểm tra.
Sau đó, đây là một số mã tôi có trên một lớp được gọi là APPSTargetConfiguration
có thể trả lời câu hỏi đơn giản này cho tôi.
static NSNumber *__isRunningTests;
+ (BOOL)isRunningTests;
{
if (!__isRunningTests) {
NSDictionary *environment = [[NSProcessInfo processInfo] environment];
NSString *isRunningTestsValue = environment[@"APPS_IS_RUNNING_TEST"];
__isRunningTests = @([isRunningTestsValue isEqualToString:@"YES"]);
}
return [__isRunningTests boolValue];
}
Một lưu ý với cách tiếp cận này là nếu bạn chạy thử nghiệm từ lược đồ ứng dụng chính của mình, như XCTest sẽ cho phép bạn làm, (nghĩa là không chọn một trong các lược đồ thử nghiệm của bạn), bạn sẽ không nhận được bộ biến môi trường này.