尝试 Kiwi stubWithBlock 时块为空:

Block is null when trying Kiwi stubWithBlock:

我正在尝试根据 API 调用的成功或失败来测试我的应用程序是否正确运行。

当我断点 __block 语句时,该块为 nil (EXC_BAD_ACCESS) 当我在底部调用 userSuccess 块时,它也为 nil。我仍在尝试将我的头完全包裹在积木周围。以为这次有,结果显然没有。

非常感谢任何帮助

    __block void (^userSuccess)(NSDictionary *data);
    __block void (^userFailure)(NSError *error);
    __block void (^authSuccess)(NSDictionary *authData);
    __block void (^authFailure)(NSError *authError);

    beforeAll(^{

        [testController stub:@selector(userManager) andReturn:[KWMock nullMockForClass:[CLASS class]]];

        [testController stub:@selector(authManager) andReturn:[KWMock nullMockForClass:[CLASS class]]];

        [testController.userManager stub:@selector(createWithData:success:failure:) withBlock:^id(NSArray *params) {

            userSuccess = [params objectAtIndex:1];
            userFailure = [params objectAtIndex:2];
            return nil;
        }];

        [testController.authManager stub:@selector(loginWithEmail:password:disableLaunch:success:failure:) withBlock:^id(NSArray *params) {

            authSuccess = [params objectAtIndex:3];
            authFailure = [params objectAtIndex:4];
            return nil;
        }];
    });

    it(@"should attempt to hit auth after a successful user call", ^{

        [[testController.authManager should] receive:@selector(loginWithEmail:password:disableLaunch:success:failure:)];
        NSDictionary *responseData = @{};
        userSuccess(responseData);
    });

注意到的一些问题:

  1. 测试中设置的 "should receive" 期望会覆盖您在 beforeAll() 中设置的存根
  2. 你应该使用 beforeEach(),它可以让你更好地控制测试(尽管在这个特殊情况下只有一个测试,beforeEach 和 beforeAll 表现相同)
  3. 您没有触发任何代码的执行,您只是在设置预期。
  4. 我对覆盖您的控制器的 getter 有更多观察,但这是一个较长的话题。

修复 #3 和 #1 应该可以解决你的问题,因为问题的原因是控制器上的登录方法没有被调用,即使被调用,测试中设置的期望也会覆盖那个在 beforeAll() 调用中设置。