iOS数据模拟 Mock方案

在团队比较紧密配合的情况下,接口文档先行,移动端开发玩接口,自行mock数据,联调查看效果。

我这里查阅了一些资料,整理了三种方式。

一、charles

1.本地文件模拟数据
不灵活、规模小、没有随机性、很难测试出边界情况
2.远程服务模拟数据
需要占用服务器资源,消耗一些测试接口的开发资源

Tools–>Map Local–>Enable Map Local —>add —>

Map From
Protocol:https
host:www.baidu.com

Map To
Local Path:xxx

具体详细的内容,可以查询下相关资料

二、Mock.js

这种方式是从一本工具书《iOS性能优化实战》上看到的,自己实践了一下,觉得相对来说,这种方式最完美,笔者也更喜欢。

通过Node.js(JavaScript运行环境)、
Express(基于Node平台的web开发环境)、
Mock.js(模拟数据结构,生成随机JavaScript库),很容易实现一个本地数据模拟服务。

安装过程:可以通过homebrew进行安装
Node.js: brew install node
Mock.js: npm install mockjs
Express: npm install express
https://www.npmjs.com/package/express

过程:

1.express demo
2.cd demo
3.新建一个MockData.js文件(代码如下)
4.run code MockData.js文件
5.浏览器访问:http://localhost:8001/people

代码

var express = require('express');
var Mock = require('mockjs');
var app = express();
var data = Mock.mock ({
  'peoples|1-10':[{
    'name':"@cname",
    'age|10-40':0
  }]
})
app.get('/people',function(req,res){
  res.send(JSON.stringify(data));
})

var server = app.listen(8001, function(){
  
})

大家也可以买一本书看一下,感觉写的还不错,作为工具书很方便

三、GYHTTPMock

这个是个第三方,但是要写一部分代码,看起来就很不美观

只需要引入工程添加request限制条件,并制定返回json即可。

1.pod 'GYHttpMock'
2.在需要拦截的请求之前创建正确的mockRequest:

创建一个最简单的 mockRequest。截获应用中访问 www.weread.com 的 get 请求,并返回一个 response body为空的数据。
mockRequest(@"GET", @"http://www.weread.com");

创建一个拦截条件更复杂的 mockRequest。截获应用中 url 包含 weread.com,而且包含了 name=abc 的参数
mockRequest(@"GET", @"(.*?)weread.com(.*?)".regex).
    withBody(@"{\"name\":\"abc\"}".regex);
    
创建一个指定返回数据的 mockRequest。withBody的值也可以是某个 xxx.json 文件,不过这个 json 文件需要加入到项目中。
mockRequest(@"POST", @"http://www.weread.com").
    withBody(@"{\"name\":\"abc\"}".regex);
    andReturn(200).
    withBody(@"{\"key\":\"value\"}");
    
创建一个修改部分返回数据的 mockRequest。这里会根据 weread.json 的内容修改正常网络返回的数据
mockRequest(@"POST", @"http://www.weread.com").
    isUpdatePartResponseBody(YES).
    withBody(@"{\"name\":\"abc\"}".regex);
    andReturn(200).
    withBody(@“weread.json");

优势:


1.支持部分替换 HTTP Response,也就是可以修改真实网络返回的数据,
这是相对于其它 HttpMock 独有的核心功能。

2.客户端引入 GYHttpMock 后,只需一行代码就可以截获指定请求,
并返回所需要的数据。不需服务端支持,也不需要建立本地HTTP Server。

3.支持 NSURLConnection, NSURLSession,AFNetworking 以及所有采用 iOS Cocoa URL 加载方式的网络框架。
4.支持正则匹配 HTTP Request,这样一条 httpMock 可以同时支持多个请求。
5.mocked response 支持 json 内容的文件。一般情况下,mocked response 直接用 NSString 表达会比较清晰,
但是返回内容比较多的情况下,因为转义符的原因,将内容以 json 格式写入文件会更容易些。

例子:
DYHTTPMock.h

#import <Foundation/Foundation.h>

@interface DYHTTPMock : NSObject

+ (void)start;

@end

DYHTTPMock.m

#import "DYHTTPMock.h"
#import <GYHttpMock/GYHttpMock.h>

@interface DYHTTPMock()

@end

@implementation DYHTTPMock

#pragma mark - Init Methods

#pragma mark - Public Methods

+ (void)start {
#ifdef DEBUG
    mockRequest(@"GET", @"(.*?)(/project/product/detail)(.*?)".regex).andReturn(200).withBody([self genJSONString:@""]);
    mockRequest(@"GET", @"(.*?)(/project/enregister/relevant/info)(.*?)".regex).andReturn(200).withBody([self genJSONString:@""]);
    mockRequest(@"GET", @"(.*?)(/project/enregister/together/list)(.*?)".regex).andReturn(200).withBody([self genJSONString:@""]);
    mockRequest(@"GET", @"(.*?)(/project/enregister/together/relevant/info/byTid)(.*?)".regex).andReturn(200).withBody([self genJSONString:@""]);
    mockRequest(@"GET", @"(.*?)(/project/product/detail/base)(.*?)".regex).andReturn(200).withBody([self genJSONString:@""]);
    
    mockRequest(@"GET", @"(.*?)(/user/login/getVCode)(.*?)".regex).andReturn(200).withBody([self genJSONString:@""]);
    mockRequest(@"POST", @"(.*?)(/user/login)(.*?)".regex).andReturn(200).withBody([self genJSONString:@""]);
    
    mockRequest(@"POST", @"(.*?)(/project/enregister/ope)(.*?)".regex).andReturn(200).withBody([self genJSONString:@""]);
    
    mockRequest(@"GET", @"(.*?)(/trade/remittance/info)(.*?)".regex).andReturn(200).withBody([self genJSONString:@"汇款信息"]);
    
#endif
}

#pragma mark - Private Methods

+ (NSString *)genJSONString:(NSString *)name {
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *path = [bundle pathForResource:name ofType:@"json"];
    NSAssert(path.length, @"HJHTTPMockManager :: file:%@ not exist", name);
    NSString *bodyString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    
    //校验
    NSError *__autoreleasing *error = nil;
    id json = [NSJSONSerialization JSONObjectWithData:[bodyString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:error];
    if (!json) {
        NSAssert(json, @"HJHTTPMockManager :: response string is invaild json");
    }
    return bodyString;
}


@end
发布了95 篇原创文章 · 获赞 22 · 访问量 20万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览