Вы можете достичь этого, создав подклассы XCTestCase
.
Во время установки, если вы блокируете поток во время работы в сети, используя семафоры, а затем разблокируете поток, когда закончите сетевое событие.
Вы также можете добавить переменные в подкласс, чтобы иметь свободный доступ к переменным во всех ваших тестах.
Для цели C вам придется разделить файлы на .h и .m, чтобы иметь возможность подкласса вашего нового класса интеграционных тестов.
Пример Objective-C Реализация:
IntegrationTest.h
# import
@interface IntegrationTest : XCTestCase
// Add properties here you want your test cases to inherit.
// Added a user property as an example.
@property (nonatomic, strong, nullable) User *user;
@end
IntegrationTest.m
@implementation IntegrationTest
-(void)setUp {
[super setUp];
__weak IntegrationTest *wSelf = self;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[User registerUserWithEmail:@"SomeRandomEmail" completion:^(User *user, NSError * error) {
wSelf.user = user;
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
-(void)tearDown {
[super tearDown];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
// Do any networking related to tearing down such as deleting the user you just created
[self.user deleteWithCompletion:^(NSError *error) {
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
Пример реализации Swift приведен ниже:
class IntegrationTest: XCTestCase {
user: User?
override func setUp() {
super.setup()
// Use a semaphore to block
let semaphore = DispatchSemaphore(value: 0)
weak var wSelf = self
registerUser(email: "SomeRandomEmail" ,completion: { (user, error) in
// Signal the semaphore for the tests to start running again
// Do additional work, set variables, etc. here
wSelf?.user = user
semaphore.signal()
})
if semaphore.wait(timeout: DispatchTime.now() + .seconds(10)) == .timedOut {
// If something goes wrong in the networking handle it here
print("Networking failed")
}
}
override func tearDown() {
let semaphore = DispatchSemaphore(value: 0)
if let nonNilUser = user {
// Delete the user or do additional networking for the teardown in the same manner
user.delete(completion: { (error) in
// Do additional tear down work here
semaphore.signal()
}
} else {
semaphore.signal()
}
}
}
Все, что вам нужно сделать сейчас, это создать подкласс класса IntegrationTest и вызвать super.setUp()
и super.tearDown()
в Swift или [super setUp]
и [super tearDown]
, если в Objective-C .
Я использовал эту структуру более двух лет для интеграционных тестов, которые требуют успешной работы в сети и аутентификации.