尝试 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);
});
注意到的一些问题:
- 测试中设置的 "should receive" 期望会覆盖您在 beforeAll() 中设置的存根
- 你应该使用 beforeEach(),它可以让你更好地控制测试(尽管在这个特殊情况下只有一个测试,beforeEach 和 beforeAll 表现相同)
- 您没有触发任何代码的执行,您只是在设置预期。
- 我对覆盖您的控制器的 getter 有更多观察,但这是一个较长的话题。
修复 #3 和 #1 应该可以解决你的问题,因为问题的原因是控制器上的登录方法没有被调用,即使被调用,测试中设置的期望也会覆盖那个在 beforeAll() 调用中设置。
我正在尝试根据 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);
});
注意到的一些问题:
- 测试中设置的 "should receive" 期望会覆盖您在 beforeAll() 中设置的存根
- 你应该使用 beforeEach(),它可以让你更好地控制测试(尽管在这个特殊情况下只有一个测试,beforeEach 和 beforeAll 表现相同)
- 您没有触发任何代码的执行,您只是在设置预期。
- 我对覆盖您的控制器的 getter 有更多观察,但这是一个较长的话题。
修复 #3 和 #1 应该可以解决你的问题,因为问题的原因是控制器上的登录方法没有被调用,即使被调用,测试中设置的期望也会覆盖那个在 beforeAll() 调用中设置。