- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
下面是被测方法:
- (void)loginWithUser:(NSString *)userName andPass:(NSString *)pass {
NSDictionary *userPassD = @{@"user":userName,
@"pass":pass};
[_loginCntrl loginWithUserPass:userPassD withSuccess:^(NSString *authToken){
// save authToken to credential store
} failure:^(NSString *errorMessage) {
// alert user pass was wrong
}];
}
我想测试的是,在那个成功 block 中,其他依赖项/OCMockObject _credStore 是用适当的方法调用的。所以目前 loginCtrl 和 credStore 依赖项是 OCMockObjects,我可以 stub /期望它们。
我会 stub loginController 以在调用时以某种方式执行该 block 吗?我已经查看了一些关于使用 OCMock stub block 的问题,但我无法理解他们在做什么以及它是否适合这种情况。
实际上我想做的就是 OCMock 触发 block ([成功调用]??)以便代码 _credStore saveUserPass 完成并可以在 _credStore 上验证。
我停下来的地方:
- (void)test_loginWithuserPass_succeeds_should_call_credStore_setAuthToken {
NSDictionary *userPassD = @{@"user":@"mark",
@"pass":@"test"};
id successBlock = ^ {
// ??? isn't this done in the SUT?
};
[[[_loginController stub] andDo:successBlock] loginWithUserPass:userPassD withSuccess:OCMOCK_ANY failure:OCMOCK_ANY];
[[_credentialStore expect] setAuthToken:@"passed back value from block"];
[_docServiceSUT loginWithUser:@"mark" andPass:@"test"];
[_credentialStore verify];
}
预计到达时间:这是我根据下面 Ben 的示例得出的结果,但无法正常工作,出现 EXC_BAD_ACCESS 异常:
// OCUnit test method
- (void)test_loginWithUserPass_success_block_should_call_credentials_setAuthToken {
void (^proxyBlock)(NSInvocation*) = ^(NSInvocation *invocation) {
void(^successBlock)(NSString *authToken);
[invocation getArgument:&successBlock atIndex:3]; // should be 3 because my block is the second param
successBlock(@"myAuthToken");
};
[[[_loginController expect] andDo:proxyBlock] loginWithUserPass:OCMOCK_ANY withSuccess:OCMOCK_ANY failure:OCMOCK_ANY];
[[_credentialStore expect] setAuthToken:@"myAuthToken"];
[_docServiceSUT loginWithUser:@"mark" andPass:@"myPass"];
[_loginController verify];
[_credentialStore verify];
}
//method under test
- (void)loginWithUser:(NSString *)userName andPass:(NSString *)pass {
NSDictionary *userPassD = @{@"user":userName,
@"pass":pass};
void(^onSuccess)(NSString *) = ^(NSString *authToken){
[SVProgressHUD dismiss];
[_credentials setAuthToken:authToken];
// Ask user to enter the 6 digit authenticator key
[self askUserForAuthenticatorKey];
};
void(^onFailure)(NSString *) = ^(NSString *errorMessage) {
[SVProgressHUD dismiss];
[_alertSender sendAlertWithMessage:errorMessage andTitle:@"Login failed"];
};
[SVProgressHUD show];
[_loginCntrl loginWithUserPass:userPassD withSuccess:onSuccess
failure:onFailure];
}
最佳答案
如果我没听错,这可能会如你所愿:
@interface ExampleLC : NSObject
- (void)loginWithUserPass:userPassD withSuccess:(void (^)(NSString *authToken))successBlock failure:(void (^)(NSString *errorMessage))failureBlock;
@end
@implementation ExampleLC
- (void)loginWithUserPass:userPassD withSuccess:(void (^)(NSString *authToken))successBlock failure:(void (^)(NSString *errorMessage))failureBlock
{
}
@end
@interface Example : NSObject {
@public
ExampleLC *_loginCntrl;
}
- (void)saveToken:(NSString *)authToken;
- (void)loginWithUser:(NSString *)userName andPass:(NSString *)pass;
@end
@implementation Example
- (void)saveToken:(NSString *)authToken
{
}
- (void)loginWithUser:(NSString *)userName andPass:(NSString *)pass {
NSDictionary *userPassD = @{@"user":userName,
@"pass":pass};
[_loginCntrl loginWithUserPass:userPassD withSuccess:^(NSString *authToken){
// save authToken to credential store
[self saveToken:authToken];
} failure:^(NSString *errorMessage) {
// alert user pass was wrong
}];
}
@end
@interface loginTest : SenTestCase
@end
@implementation loginTest
- (void)testExample
{
Example *exampleOrig = [[Example alloc] init];
id loginCntrl = [OCMockObject mockForClass:[ExampleLC class]];
[[[loginCntrl expect] andDo:^(NSInvocation *invocation) {
void (^successBlock)(NSString *authToken) = [invocation getArgumentAtIndexAsObject:3];
successBlock(@"Dummy");
}] loginWithUserPass:OCMOCK_ANY withSuccess:OCMOCK_ANY failure:OCMOCK_ANY];
exampleOrig->_loginCntrl = loginCntrl;
id example = [OCMockObject partialMockForObject:exampleOrig];
[[example expect] saveToken:@"Dummy"];
[example loginWithUser:@"ABC" andPass:@"DEF"];
[loginCntrl verify];
[example verify];
}
@end
此代码允许使用您指定的参数调用真正的成功 block ,然后您可以验证该参数。
关于ios - OCMock 和 block 测试,执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17644772/
我有一个 iOS 应用程序,我正在尝试将 OCMock 添加到其中,以便更好地对其进行单元测试。我已经按照 ocmock.org 上的说明以及我在其他地方找到的说明进行操作,但仍然无法编译我的测试代码
我正在使用 OCMock 来帮助我正在使用 Xcode 为 iPad 应用程序进行的测试驱动开发。我有这样的测试代码: id mock = [OCMockObject mockForProtocol:
在使用 OCMock 框架编写单元测试时,我遇到了一些具体的问题。 假设我有一些带有一个参数的方法。我需要的是 stub 该方法并返回相同的值。该值是计算出来的,所以我不能只通过通常的 stub 返回
我正在尝试为我创建的简单 UIDevice 类别设置一些测试用例。 由于这些方法是实例方法,因此我创建了一个模拟来模拟 currentDevice 行为。 添加的方法基于 name 属性,因此我创建了
我正在使用 OCMock 来测试从 Storyboard 中实例化的 UIViewController。遵循最佳实践, View Controller View 的 subview 的所有 IBOut
我这样设置模拟观察者: id quartileObserverMock = [OCMockObject observerMock]; [[NSNotificationCenter defaultCen
我有一个测试(使用 OCMock)验证在发送特定通知时调用了一个方法: - (void)testThatVCRegistersToLocationUpdateNotification { Is
我想使用 OCMock 这样,无论何时使用任何参数调用 someMethod,它都会调用带有参数“dict”的 callBackMethod:,这是一个 NSDictionary。我找到了 andCa
我一直在使用 OCMock 创建 stub 和模拟。不过,我正在努力模拟本地声明的对象方法。 如果我有下面的代码: // Example.m #import "Object.h" - (NSStrin
我做了一个部分模拟,一个测试按预期运行,但对于第二个测试,它连续调用 setUp 和 teardown 而没有调用实际测试。 - (void)setUp { [super setUp]; _r
我正在尝试在我们的大型项目中设置一些单元测试。问题是某些 ViewController 在调用部分模拟崩溃时会出现以下跟踪: error: -[EspionageViewControllerTests
当我们用OCMock创建一个模拟对象时,例如 id classMock = OCMClassMock([SomeClass class]); classMock 是后台 SomeClass 的真实对象
我正在加快使用 OCMock 模拟 iOS 的速度。我写了一个简单的模拟单元测试,当它应该失败时——基于我设定的期望——它会通过。 代码如下: // Scientific Calculator cla
我正在尝试模拟一个类方法来识别 iOS 是 iOS 6(或更早版本)还是 iOS 7(或更高版本)。这是测试代码: id iOSDetectorMock = [OCMockObject mockFor
这是一个关于 OCMock 期望的极其基本的问题。让我们在 objectA 上有一个实例方法 methodA,它调用 objectA 上的实例方法 methodB。 - (void)methodA {
我有一个如下签名的方法; - (NSInteger) getFirstVisitTimeStamp; 当我使用 OCMock 模拟并返回一个值时,测试失败并出现以下错误。 [[[[YSNYI13NMo
我终于将一些 TDD 强加到我正在从事的项目中,并且遇到了边缘......我知道我想要的代码但不知道如何测试它:) 我正在寻找的实现是: - (void) doSomething { FooB
我是新来的 OCMock . 我使用 dispatch_once() 创建了一个单例类 MyManager : @implementation MyManager + (id)sharedInstan
我正在尝试为输出取决于 NSDate 的 timeIntervalSinceNow 返回值的方法编写测试。我想在我的测试中指定返回值,以便我可以测试某些场景。 我很难让这个 OCMock 对象返回我想
我是 OCMock 的新用户,所以我可能只是遗漏了一些简单的东西。此代码无法编译: id mockSession = [OCMockObject mockForClass:[AVCaptureSess
我是一名优秀的程序员,十分优秀!