LoginSignup
3
3

More than 5 years have passed since last update.

SpectaでiOSアプリのUnitTestをしてみる

Posted at

spectaとは

install

SpectaのGithub

  • pod lib createコマンドでテストフレームワークを選ぶところがあるのでspectaを選べばインストールされる
  • そうじゃなくても、PodfileにSpectaを追加すればよし

テストを書く

SpectaのReadmeを参考にする

  • before/afterの設定もできる
    • beforeEachの中にテストを書いてみたけど、Test navigatorに反映されてないから書かないほうがいい...?
  • OHHTTPStubsを使ってスタブのテストを書いてみた例
    • PodfileにOHHTTPStubsも追加している
#import <Specta/Specta.h>
#import <OHHTTPStubs/OHHTTPStubs.h>

SpecBegin(StubTest)

beforeAll(^{

    NSDictionary *responseDic = @{@"key":@"value"};
    NSData *jsonResponse = [NSJSONSerialization dataWithJSONObject:responseDic options:0 error:nil];

    //CreateStub
    // Objective-C
    [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
        return [request.URL.absoluteString isEqualToString:@"https://example.com/2013-09-01/classes/Test"];
    } withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) {
        return [OHHTTPStubsResponse responseWithData:jsonResponse
                                          statusCode:200
                                             headers:@{@"Content-Type":@"application/json"}];
    }];
});

describe(@"OHHTTPStubs", ^{
    it(@"should return stub response", ^{
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://example.com/2013-09-01/classes/Test"]];
        NSHTTPURLResponse *response = nil;
        NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
        expect([NSJSONSerialization JSONObjectWithData:responseData
                                               options:NSJSONReadingAllowFragments
                                                 error:nil]
               ).to.equal(@{@"key":@"value"});
    });
});

afterAll(^{
    [OHHTTPStubs removeAllStubs];
});

SpecEnd
  • 値を検証するmatcherにはexpectaを使っている
    • 利用できるmatcherの種類はReadmeで確認できる

テストを実行

XcodeのProduct / Testを実行すると、テストが実行されます。

Test Navigaterの表示がリセットされない

  • Xcode6.2での話
  • プロジェクトを再度開かないと削除したテストケースはクリアされない。。。?

テストクラス用テンプレートを作る

  • テンプレートをXcodeに追加してくれるリポジトリがあった
  • git cloneして、テンプレートファイルを編集
vim Specta\ Spec.xctemplate/___FILEBASENAME___.m

import文を書き換えたのですが、
別に変更しなくてもいいかもしれないです。。。

//
//  ___FILENAME___
//  ___PROJECTNAME___
//
//  Created by ___FULLUSERNAME___ on ___DATE___.
//  Copyright ___YEAR___ ___ORGANIZATIONNAME___. All rights reserved.
//

//import文をちょっと変更
#import <Specta/Specta.h>
#import "___VARIABLE_testedClass___.h"


SpecBegin(___VARIABLE_testedClass___)

describe(@"___VARIABLE_testedClass___", ^{

    beforeAll(^{

    });

    beforeEach(^{

    });

    it(@"", ^{

    });  

    afterEach(^{

    });

    afterAll(^{

    });
});

SpecEnd

  • ./install-templates.shを実行

新規ファイル作成時にSpectaを選択すると、
テスト対象のクラス名を入力してSpecファイルを作成できるようになる

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3