【问题标题】:iOS8 bad access exception when doing unit tests with expectationiOS8在进行单元测试时出现错误的访问异常
【发布时间】:2014-12-08 06:26:00
【问题描述】:

我有一系列使用 XCTest 框架编写的单元测试。这些最初是在 iOS7 上创建的,然后在 iOS8 设备上的 xCode6 中执行。测试按顺序执行,但随后我得到以下代码块的 EXC_BAD_ACCESS (code= 1, address 0xc)。使用 xcode 中的“测试”命令执行测试时会发生这种情况。

如果我从测试左侧面板单独执行此测试,它正常通过或失败。

这就是我认为我正在做的事情:

  • 设置期望
  • 获取数据源(旧的立即返回)
  • 从网络资源异步更新数据源。
  • 测试用例收到委托回调通知并满足预期

如何确保我可以毫无例外地执行所有单元测试?

//单元测试

-(void)testNetworkDataSourceUpdate
{
    self.expectation = [self expectationWithDescription:@"Getting network datasource"];

    DataSource* dataSource = [DataSourceProvider datasourceWithRefreshDelegate:self];
    XCTAssertNotNil(dataSource, @"Should have datasource immediately available");


    //Bad access here
    [self waitForExpectationsWithTimeout:10.0 handler:^(NSError *error) {

    }];

}

//回调

-(void)refreshDatasource:(NSMutableArray*)datasource
{

   [self.expectation fulfill];
}

【问题讨论】:

    标签: objective-c unit-testing ios8 xctest expectations


    【解决方案1】:

    我遇到了同样的问题,导致每次块调用都崩溃。

    错误是由在后台运行的主应用程序引起的。您可以通过为您的测试目标添加您自己的 AppDelegate 来阻止这种情况,这不会启动通常的应用程序流程。 因此,从测试目标中删除旧的 AppDelegate,创建一个新的并将其添加到您的测试目标中。

    然后您必须更改您的 main.m 文件以在应用启动时设置正确的应用委托:

    int main(int argc, char *argv[]) {
        @autoreleasepool {
            int returnValue;
            BOOL inTests = NSClassFromString(@"XCTest") != nil;
    
            if (inTests) {
                //use a special empty delegate when we are inside the tests
                returnValue = UIApplicationMain(argc, argv, nil, @"AppDelegateTest");
            } else {
                //use the normal delegate
                returnValue = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
            }
    
            return returnValue;
        } }
    

    【讨论】:

      猜你喜欢
      • 2016-05-06
      • 1970-01-01
      • 2017-11-17
      • 2013-01-21
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      相关资源
      最近更新 更多