【问题标题】:How to control the loading result of UIWebView's loadRequest?UIWebView的loadRequest的加载结果如何控制?
【发布时间】:2014-04-02 13:04:12
【问题描述】:

我有两个测试取决于 loadRequest 方法的成功和失败状态(一些代码要在委托方法中验证)。

我想验证委托方法中的代码,而不是在没有连接到互联网的情况下实际打开 Web 视图晚上。我怎样才能实现它?

非常感谢

编辑:

也许是 UIWebView 的模拟对象?

【问题讨论】:

  • 这是单元测试的问题吗?
  • @michaels 是的,是关于 ut..

标签: ios cocoa unit-testing uiwebview


【解决方案1】:

只需使用 AFNetworking 并像这样设置它:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

然后您就可以知道加载是否成功。如果您的网站总是返回 200 状态代码,那么您只需在成功块中添加一个 if / then 块。

【讨论】:

  • 谢谢你,米凯尔。 AFNetworking 有一个类 UIWeiView+AFNetworking 可以完成你的代码的工作,但它不适合这种情况。其实我想手动控制响应,这样即使不连接互联网也可以测试委托方法。
【解决方案2】:

OCMock 是一个 Objective-C 模拟框架,它允许完全模拟类、部分模拟对象以及期望和方法存根。

要模拟 UIWebView,您只需要这样做

id webViewMock = [OCMockObject mockForClass:[UIWebView class]];

然后你可以设定期望:

[[[webViewMock expect] andDo:^(NSInvocation *) {
    // Call your failure or success block
}] someMethodWithArgs:OCMOCK_ANY];

然后在可以拦截正确调用的地方注入你的模拟。

你也应该调用

[webViewMock verify];

确保调用了预期的方法

【讨论】:

  • OCMock 很棒,但是我选择 Kiwi 来测试我的代码。我没有模拟 UIWebView,而是模拟了一个符合 UIWebViewDelegate 协议的对象。然后我将委托消息发送给客户端,以便我可以手动控制结果。
【解决方案3】:

我做了一个符合UIWebViewDelegate的对象,设置为UIWebView的delegate,代码类似如下:

@interface MyObject : Object <UIWebViewDelegate>
...
@end

...

MyObject myObject = [[MyObject alloc] init];
webView.delegate = myObject;

我可以手动触发委托方法:

[myObject webView:webView didFailLoadWithError:mockError];
[myObject webViewDidFinishLoad:webView];

当然,webView 是一个模拟对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    相关资源
    最近更新 更多