ios - 使用Specta和OHHTTPStubs的iOS异步单元测试永远不会失败(应该这样做!)

标签 ios unit-testing stubbing ohhttpstubs

我正在尝试对应用程序中的网络代码进行单元测试,但是在遇到一些问题之前,我想看看我的测试无法确保它能够正常工作,然后再通过所有测试。问题是,它总是在过去。我正在使用Xcode6-Beta7,以防出现问题

我正在使用Specta进行测试,并使用OHHTTPStubs对我的网络请求进行 stub 并在响应中返回状态代码。

这是我设置和拆卸的代码

beforeEach(^{
    [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
        return YES;
    } withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) {
        return [OHHTTPStubsResponse responseWithData:nil statusCode:200 headers:nil];
    }].name = @"My Test Stub";

    [OHHTTPStubs onStubActivation:^(NSURLRequest *request, id<OHHTTPStubsDescriptor> stub) {
        NSLog(@"%@ stubbed by %@", request.URL, stub.name);
    }];
});

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

在测试的下一部分(问题区域)中,我将创建我的类的实例,该实例将操作NSMutableURLRequest,然后检查其是否为nil。
context(@"Given that I create a http request with a URL", ^{
    __block NLXApiBaseServices *baseService = [[NLXApiBaseServices alloc] init];
    NSMutableURLRequest *testRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]];

    it(@"should have a base service created", ^{
        expect(baseService).toNot.beNil();
    });

此第一个测试有效,然后下一个测试使用 stub 。这应该会失败,因为我的 stub 应该返回200,而我正在测试它是否等于400
    it(@"should have a return code of 200", ^AsyncBlock{
        [baseService dataWithHttpRequest:testRequest successCallback:^(NSInteger statusCode, NSDictionary *response, NSDictionary *responseHeaders) {
            expect(statusCode).to.equal(400);
            done();
        } errorCallback:^(NSInteger statusCode, NSDictionary *response, NSError *error) {
        }];
    });

在这里,我使用AsyncBlock关键字执行异步测试,并使用done()表示已完成。我要注意的是Xcode会报告测试成功,但是通过查看控制台中的日志,我可以看到
Test Suite 'All tests' passed at 2014-09-07 22:11:22 +0000. Executed 95 tests, with 0 failures (0 unexpected) in 0.489 (0.816) seconds
在仔细检查我的日志记录后,我发现
2014-09-07 23:11:21.480 TwoUpTop[9255:116602] Request <http://www.google.com>
2014-09-07 23:11:21.486 TwoUpTop[9255:116661] http://www.google.com stubbed by My Test Stub
2014-09-07 23:11:21.487 TwoUpTop[9255:116648] NLXApiBaseServicesSpec.m:49 expected: 400, got: 200
Test Case '-[NLXApiBaseServicesSpec   NLXApiBaseServices_Given_that_I_create_a_http_request_with_a_URL_should_have_a_return_code_of_200]' passed (0.012 seconds).

所以现在,我很困惑-它提示状态码不相等-但是测试通过了!!!

外面有人知道我做错了什么吗?

如果有帮助,则NLXApiBaseService类从NSURLSessionConfiguration对象创建一个NSURLSessionDataTask,该对象是在我使用defaultSessionConfiguration初始化NLXApiBaseService类时创建的。

最佳答案

看来这可以解决问题。

[baseService dataWithHttpRequest:testRequest successCallback:^(NSInteger statusCode, NSDictionary *response, NSDictionary *responseHeaders) 
      dispatch_async(dispatch_get_main_queue(), ^{
          expect(statusCode).to.equal(200);
      });
      done();
      } errorCallback:^(NSInteger statusCode, NSDictionary *response, NSError *error) {
}];

当我测试expect(statusCode).to.equal(404);时,这也正确地报告失败

这是在Specta的Github页面上报告的:-https://github.com/specta/specta/issues/44

关于ios - 使用Specta和OHHTTPStubs的iOS异步单元测试永远不会失败(应该这样做!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25715370/

相关文章:

unit-testing - 有没有办法使用 Elixir 中的 Doctest 测试 IO 输出?

unit-testing - 由于编写可测试代码而导致工厂过多

java - 我正在尝试使用 Mockito 2 模拟最终的 java 类,类被模拟,但我仍然收到未完成的 stub 异常

go - 如何验证是否调用了特定函数

ios - 更改 UITableView 部分标题的字体大小

ios - CCSprite 上的黑色背景

sql - 如何使用sql查询将数据库的子集提取到dbunit文件中?

ruby-on-rails - 如何使用 mocha stub send_file

php - 如何从 Objective-C/iOS 中恢复 PHP $_SESSION 变量?

ios - 在 ScrollView 中加载 gif