0

メイン ビュー コントローラーの ViewDidLoad にステップ インし、get all tweets を呼び出している行にアクセスしていますが、ベースと派生の両方の getAllTweets にブレークポイントを配置して、予想どおりに派生にヒットしていないかどうかを確認しました。

@implementation WWMainViewControllerTests {

    // system under test
    WWMainViewController *viewController;

    // dependencies
    UITableView *tableViewForTests;
    WWTweetServiceMock *tweetServiceMock;    
}

- (void)setUp {

    tweetServiceMock = [[WWTweetServiceMock alloc] init];
    viewController = [[WWMainViewController alloc] init];
    viewController.tweetService = tweetServiceMock;
    tableViewForTests = [[UITableView alloc] init];
    viewController.mainTableView = tableViewForTests;
    tableViewForTests.dataSource = viewController;
    tableViewForTests.delegate = viewController;
}

- (void)test_ViewLoadedShouldCallServiceLayer_GetAllTweets {

    [viewController loadView];
    STAssertTrue(tweetServiceMock.getAllTweetsCalled, @"Should call getAllTweets on tweetService dependency");
}

- (void)tearDown {

    tableViewForTests = nil;
    viewController = nil;
    tweetServiceMock = nil;
}

基本のツイート サービス:

@implementation WWTweetService {

    NSMutableArray *tweetsToReturn;
}

- (id)init {

    if (self = [super init]) {
        tweetsToReturn = [[NSMutableArray alloc] init];
    }

    return self;
}
- (NSArray *)getAllTweets {

    NSLog(@"here in the base of get all tweets");
    return tweetsToReturn;
}

@end

モックツイートサービス:

@interface WWTweetServiceMock : WWTweetService

@property BOOL getAllTweetsCalled;

@end

@implementation WWTweetServiceMock

@synthesize getAllTweetsCalled;

- (id)init {

    if (self = [super init]) {
        getAllTweetsCalled = NO;
    }

    return self;
}

- (NSArray *)getAllTweets {

    NSLog(@"here in the mock class.");
    getAllTweetsCalled = YES;
    return [NSArray array];
}

テスト中のメイン ビュー コントローラー:

@implementation WWMainViewController
@synthesize mainTableView = _mainTableView;
@synthesize tweetService;

NSArray *allTweets;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    allTweets = [tweetService getAllTweets];
    NSLog(@"was here in view controller");
}

- (void)viewDidUnload
{
    [self setMainTableView:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}
4

1 に答える 1

1

でデバッガーに割り込むことができるので、 ivarviewDidLoadの値は何ですか?tweetServiceの場合nilgetAllTweetsメッセージはノーオペレーションになります。ivarが適切に設定されていないか、他の場所でオーバーライドされていない可能性があります。

基になるivarではなく、プロパティを使用してtweetService(call )にアクセスする必要があります。ゲッター、セッター、および(なんらかのクレイジーな理由でARCを使用していない場合もself.tweetService)でivarに直接アクセスする必要があります。initdealloc

また、自分自身を呼び出すのではなく、ViewControllerのプロパティにloadViewアクセスするだけです。viewこれにより、読み込みプロセスが開始され、が呼び出されますviewDidLoad

また、モックをたくさん行う場合は、OCMockを強くお勧めします。

于 2012-09-28T22:11:46.410 に答える