首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么此OCUnit测试失败?

为什么此OCUnit测试失败?
EN

Stack Overflow用户
提问于 2012-09-29 03:50:06
回答 1查看 318关注 0票数 0

它进入了主视图控制器的ViewDidLoad,并命中了调用get all tweets的代码行,但我在基类和派生类的getAllTweets中都设置了一个断点,以查看它是否没有像我预期的那样命中派生类。

代码语言:javascript
复制
@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;
}

基础推文服务:

代码语言:javascript
复制
@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

模拟推文服务:

代码语言:javascript
复制
@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];
}

测试中的主视图控制器:

代码语言:javascript
复制
@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.
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-29 06:11:46

既然您能够在viewDidLoad中中断调试器,那么tweetService ivar的价值是什么?如果它是nil,那么getAllTweets消息将只是一个no op。也许ivar没有被正确设置或在其他地方被覆盖。

您可能应该使用该属性来访问tweetService (调用self.tweetService),而不是它的底层ivar。你应该只在getter,setters和init中直接访问ivar (如果出于某种疯狂的原因不使用dealloc,也可以使用它)。

您也不应该自己调用loadView,而应该只访问视图控制器的view属性。这将启动加载过程并调用viewDidLoad

另外,如果你做了很多模拟,我强烈推荐OCMock

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12646470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档