Git Product home page Git Product logo

mock's Issues

能否让mock规则支持运算?

1、能否让mock规则支持运算?
可以实现简单的加减乘除,这样就可以配合动态参数,模拟出比较真实地接口行为。

2、能否获取当前数组元素的index?比如用@INDEX来表示
虽然可以通过增加一个自增类型的字段来辅助实现(例如自增id,可以用@id来获取index),不过该辅助字段并非接口真实所用的字段。

mock没有阻止ajax请求

预览地址 : mock-demo

    <script>
        Mock.mock('mockjs.json', {
            'list|1-10':[{
                'id|+1':1,
                'email':'@EMAIL'
            }]
        });

        $.ajax({
            url: 'mockjs.json',
        }).done(function(data, status, xhr){
            console.dir(
                JSON.stringify(data, null, 4)
            )
        })
    </script>

mock没有阻止ajax请求,报错!请问这是为啥?

能不能增加模拟ajax请求延时响应?

有很多ajax请求都是需要有一些界面的交互过程的,比如显示loading提示等,但是现在是没有任何延迟,以至于前期开发过程根本就看不到这些效果,很难调试。

我在我的fork库里面做了些修改,这样调用ajax的响应方法时,就可以延迟几秒,可以更好的模拟真实的网络环境,秒数是一个范围内的随机数:
https://github.com/luozhihua/Mock/blob/master/src/mockjax.js#L52

对备选元素 'pick|1': [] 也需要解析,而不是选取一个原样返回

例如,在下面的 数据模板 中,备选元素 中仍然含有 占位符:

{
    'pick|1': [{
            url: '@URL'
            method: 'GET'
        }, {
            url: '@URL'
            method: 'POST'
        }, {
            url: '@URL'
            method: 'HEAD'
        }, {
            url: '@URL'
            method: 'DELETE'
        }
    ]
}

注意:

  1. 如果对备选元素不做解析,则返回的是备选元素之一
  2. 如果对备选元素进行解析,则会返回备选元素之一的副本

更新日志

2013.7.12

  1. Mock.mock(rurl, template) 的参数 rurl 可以是字符串或正则。
  2. 把产生随机元数据的接口封装到 Mock.Random 中。
  3. 增加对日期的格式化。
  4. 增加占位符 @img@paragraph@Sentence@word@FIRST@last@name@Domain、@EMAIL、@ip@id
  5. 支持嵌套的占位符,例如 @IMG(@AD_SIZE)
  6. 支持把普通属性当作占位符使用,例如 @IMG(@size)

2013.7.18

  1. 增加占位符 @color
  2. 完善对占位符的解析,过滤掉 #%&()?/.
  3. 对“支持的占位符”分组。

2013.7.31

  1. 50% 基于客户端模板生成模拟数据。

2013.8.2

  1. 60% 基于客户端模板生成模拟数据。
  2. 增加测试用例 test/mock4tpl-node.js,参考自 http://handlebarsjs.com/。

2013.8.7

  1. 75% 基于客户端模板生成模拟数据。
  2. 完善测试用例 test/mock4tpl-node.js
  3. 重构文件和目录结构,把代码模块化。
  4. 参考 Handlebars.js,引入 Jison 生成模板解析器。

2013.8.11

  1. 80% 基于客户端模板生成模拟数据。
  2. 完善针对 KISSY XTemplate 的测试用例 test/mock4tpl-xtpl-node.js
  3. Mock4Tpl 支持 Partials。
  4. Mock 支持转义 @。
  5. 更新 README.md,增加对 Mock4Tpl 的说明。
  6. 完善 demo
  7. 减少 Mock、Mock4Tpl 暴漏的 API。

2013.8.21

  1. 100% 基于客户端模板生成模拟数据,支持 KISSY XTemplate。
  2. 调整文件结构。

支持返回中文段落

现在sentence返回的都是些英文字符, 是否可以支持返回中文字符, 这样在测试某些页面布局时比较好办.

占位符语法特性不完整

引言

Mock.js 语法分为两类,「模板」与「占位符」。模板语法的设计相较占位符更加简洁友好,但有一个缺陷即其语法限制了模板方式只能构造 key - value 形式的数据片段。相对的,占位符语法则更加严谨。在我的理解中,模板方式是占位符方式的简化,模板方式能构造的数据是占位符方式能构造的数据的子集。

问题

在现在的版本(1.5)中,所有使用模板语法能构造的数据片段都可以使用占位符方式构造,除了:

  1. 重复元素的数组:"name|count": [{}, {} ...], "name|min-max": [{}, {} ...]
  2. 重复内容的字符串:"name|count": "value", "name|min-max": "value"

这意味着,上面这些类型的数据片段,不能独立于 key(name) 单独存在。这导致在两种情况下现有的语法无法构建所需的数据:

  • 该数据片段即为 JSON 根节点

    [{}, {}, {}, ...]
    
    "★★★★★"
    
  • 该数据片断为数组元素

    {
     "array": [
        [{}, {}, {}, ...]
        ...
      ]
    }
    
    {
      "array": ["★★★", "★★★★★", ...]
    }
    

其中,「重复元素的数组作为 JSON 根节点」是 Restful API 风格对列表资源的约定,被广泛采用——这里有一个相关的 issue: #6——无法构建此类数据也是我目前真正遇到问题。其他情况在目前的实践中几乎不会遇到,在此提出是出于对占位符语法特性完整性的考虑。

提议

这里我冒昧提出一个可行的解决方案,即增加以下占位符语法:

Basics

["@ARRAY", item, count], ["@ARRAY", item, min, max]

["@ARRAY", {}, 3] 
//=>
[{}, {}, {}]

值得指出的是,这里将占位符的形式从单纯的字符串扩展到了一个特定格式的对象。

Helpers

"@REPEAT('string', count)", "@REPEAT('string', min, max)"

{
  "array|10": ["@REPEAT('★', 1, 5)"]
}
//=>
{
  "array": ["★★★", "★★★★★", ...]
}

Mock 规划

  1. √ 暴露产生随机元数据的接口。
  2. 重构项目结构,设计更好用的 API。
  3. √ 基于客户端模板生成模拟数据。
  4. 50% 提供随机图片生成服务。
  5. 30% 提供自定义模板数据的保存和访问服务。
  6. 提供真正的随机数。
  7. 支持 UUID、SHA、MD5。

是不是相同的url返回的数据,都是相同的呢

Mock.mock(//inc/Task_edit.htm?id=/, {
id: "",
name: Random.string("upper", 20),
subName: Random.string("upper", 20),
userRange: Random.natural(0, 1),
status: Random.natural(0, 1),
description: Random.string("upper", 50),
url: "",
finish: 0,
award: 0,
pic: "",
showBtn: Random.natural(0, 1),
activeBtnName: "签到",
finishBtnName: "已签到",
orderNo: "1",
recommend: Random.natural(0, 1),
platCodes: Random.range(1, 7)
});

这样写,我每次拿到的数据都是一样的,没有变

函数属性应该放到最后解析和执行

例如下面的例子,函数 xfn2xfn4 都依赖于属性 x,但是 xfn2x 之前,导致在执行 xfn2 无法找到 x,最终 xfn2 的值为 null。

var tpl = {
    xfn2: function() {
        return this.x * 2
    },
    x: 1,
    xfn4: function() {
        return this.x * 4
    }
}
// =>
{
    "xfn2": null,
    "x": 1,
    "xfn4": 4
}

解决方案

一种简单的方案是,把所有的函数属性都放在最后执行,可以应对大部分的场景。

严格来说,这么做并不能覆盖所有场景,例如其中一个函数属性依赖了另一个函数属性。

Mock.js规则控制最外层结构的问题

客户描述

新版本提供了两种类型的返回格式:对象、数组。
对于数组,希望返回的是一个数组对象,且能够让mock生成多个项。
但是设定了返回类型为数组,且设定了响应参数后,生成的数据(数组对象),长度一直是1。
是否有什么方式可以让其随机生成不同长度的数组对象?

个人分析

最外层比较特殊,这一块儿请@墨智 老师看看把,上次我们聊到virtual root类似的实现是否可以解决最外层MOCK规则控制的问题呢?

就目前而言,Mock.js并没有对最外层数据提供控制的方式。

Bower.json缺少main字段

当我使用grunt-wiredep插件自动将所有已安装的bower包引用到HMTL页面时,会报错,提示mockjs未被注入到HTML中,经测试发现是因为MockJs的bower.json的main字段没有设置所导致的。

解决方法:

  1. 在bower.json中加入"main": ["mock.js"]
  2. 在github的Mock仓库创建新的tag(release).

能否提供数据验证功能?

比如 提供这样的形式:
Mock.validate( mock_template, data ).
这个功能很重要,
这个如果没有该功能,则无法形成开发和测试的闭环。

如何生成一个有数量范围的随机数组

按照语法规范'name|min-max': value 或者 'name|count': value 生成的东西都是重复值 ,按照Random.range(start, stop, step)生成又都是规律 , 请问如我要生成一个如标题的数组该怎么办啊!

Mock.Random.dateImage() dont work in nodejs

  app.get('/foo', function (req, res) {
    var data = Mock.mock({
      "thumb": Mock.random.dataImage('200x100', 'test')
    });
    res.jsonp(data);
  });
  // mockjs: v0.1.4
  // nodejs: v0.10.28

带有自定义函数的复杂JSON,使用Mock.mock时报错

请看看,某位客户的JSON,通过RAP生成了模板后,在Mock.mock时报错。

{
    "extra": {
        "page": 1,
        "pagesize": 20,
        "totalpage": 1,
        "total": 10
    },
    "message": "\u64cd\u4f5c\u6210\u529f",
    "result": true,
    "code": 99999999,
    "data|2": [{
        "designer_id": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(1,1)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10000';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "scene_name": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"\u5546\u54c1\u6548\u679c\u6d4b\u8bd5\",\"\u5546\u54c1\u6548\u679c\u6d4b\u8bd5\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10001';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "in_shelf": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(1,1)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10002';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "room_args": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"{\"1\":{\"id\":1,\"FOVx\":65.97752238227275,\"FOVy\":40.117807,\"Position\":{\"x\":3.368628,\"y\":-2.995035,\"z\":1.4},\"Quaternion\":{\"x\":0.722453,\"y\":0.001152,\"z\":-0.001102,\"w\":-0.691419},\"angleX\":107.922626,\"angleY\":45.132237,\"dragAngleX\":107.922626,\"dragAngleY\":45.132237,\"isPanorama\":true,\"dragAngleLeft\":52,\"dragAngleRight\":33,\"dragAngleUp\":22,\"dragAngleDown\":22,\"exposureBias\":1,\"QuaternionNew\":{\"x\":-0.7155519334704465,\"y\":-0.08015251829528554,\"z\":0.07724920278482071,\"w\":0.6896329204632993}},\"room\":{\"sizeX\":13.4,\"sizeY\":7.2,\"sizeZ\":3.2,\"isPanorama\":true}}\",\"{\"1\":{\"id\":1,\"FOVx\":65.97752238227275,\"FOVy\":40.117807,\"Position\":{\"x\":3.368628,\"y\":-2.995035,\"z\":1.4},\"Quaternion\":{\"x\":0.722453,\"y\":0.001152,\"z\":-0.001102,\"w\":-0.691419},\"angleX\":107.922626,\"angleY\":45.132237,\"dragAngleX\":107.922626,\"dragAngleY\":45.132237,\"isPanorama\":true,\"dragAngleLeft\":52,\"dragAngleRight\":33,\"dragAngleUp\":22,\"dragAngleDown\":22,\"exposureBias\":1,\"QuaternionNew\":{\"x\":-0.7155519334704465,\"y\":-0.08015251829528554,\"z\":0.07724920278482071,\"w\":0.6896329204632993}},\"room\":{\"sizeX\":13.4,\"sizeY\":7.2,\"sizeZ\":3.2,\"isPanorama\":true}}\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10003';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "style_id": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(1,1)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10004';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "creator": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"\",\"\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10005';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "pics_path": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"\",\"\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10006';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "user_id": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(0,0)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10007';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "adv_bottom": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"\",\"\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10008';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "haspics": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(0,0)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10009';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "isrecommend": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(0,0)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10010';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "root_id": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(0,0)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10011';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "desc": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"<p>12<\/p>\",\"<p>12<\/p>\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10012';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "model_info": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"[{\"id\":157,\"position\":{\"x\":0.8290811648136097,\"y\":2.773665489427823,\"z\":0.3800000000000001},\"rotation\":{\"x\":0,\"y\":0,\"z\":0.06920367457323079},\"quaternion\":{\"x\":0,\"y\":0,\"z\":0.034594932977462294,\"w\":0.9994014161548326}},{\"id\":37,\"position\":{\"x\":3.211819238806907,\"y\":0.8361365252640024,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":-1.5207963275941434},\"quaternion\":{\"x\":0,\"y\":0,\"z\":-0.6892099939523402,\"w\":0.72456164971396}},{\"id\":37,\"position\":{\"x\":2.1239044442716355,\"y\":0.7270494947133531,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":1.809203666420212},\"quaternion\":{\"x\":0,\"y\":0,\"z\":0.7861791507359865,\"w\":0.6179986593416227}},{\"id\":64,\"position\":{\"x\":1.2854428247993726,\"y\":2.1088075631936727,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":-1.5707963267948963},\"quaternion\":{\"x\":0,\"y\":0,\"z\":-0.7071067811865475,\"w\":0.7071067811865477}},{\"id\":160,\"position\":{\"x\":2.5180308423769353,\"y\":1.7037948087943773,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":-0.0007963267961379878},\"quaternion\":{\"x\":0,\"y\":0,\"z\":-0.00039816338754858187,\"w\":0.9999999207329553}},{\"id\":110,\"position\":{\"x\":4.363383838660308,\"y\":1.8446611590397413,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":-0.6207963216517365},\"quaternion\":{\"x\":0,\"y\":0,\"z\":-0.30543779417332834,\"w\":0.9522120320026057}},{\"id\":150,\"position\":{\"x\":0.38423754919784114,\"y\":2.8821267664956207,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":0.12920367633817348},\"quaternion\":{\"x\":0,\"y\":0,\"z\":0.06455691268644366,\"w\":0.9979140268702484}},{\"id\":179,\"position\":{\"x\":1.6566218773145178,\"y\":0.6982262358268683,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":-0.3207963322474933},\"quaternion\":{\"x\":0,\"y\":0,\"z\":-0.15971127443568203,\"w\":0.9871637700088726}},{\"id\":116,\"position\":{\"x\":0.7876551977953973,\"y\":1.0447069865075296,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":0.4692036732051035},\"quaternion\":{\"x\":0,\"y\":0,\"z\":0.2324557474516606,\"w\":0.9726069737960394}},{\"id\":123,\"position\":{\"x\":0.2772290873919028,\"y\":0.450067813046513,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":0.9792036732051036},\"quaternion\":{\"x\":0,\"y\":0,\"z\":0.47027453822665294,\"w\":0.8825201746678136}}]\",\"[{\"id\":157,\"position\":{\"x\":0.8290811648136097,\"y\":2.773665489427823,\"z\":0.3800000000000001},\"rotation\":{\"x\":0,\"y\":0,\"z\":0.06920367457323079},\"quaternion\":{\"x\":0,\"y\":0,\"z\":0.034594932977462294,\"w\":0.9994014161548326}},{\"id\":37,\"position\":{\"x\":3.211819238806907,\"y\":0.8361365252640024,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":-1.5207963275941434},\"quaternion\":{\"x\":0,\"y\":0,\"z\":-0.6892099939523402,\"w\":0.72456164971396}},{\"id\":37,\"position\":{\"x\":2.1239044442716355,\"y\":0.7270494947133531,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":1.809203666420212},\"quaternion\":{\"x\":0,\"y\":0,\"z\":0.7861791507359865,\"w\":0.6179986593416227}},{\"id\":64,\"position\":{\"x\":1.2854428247993726,\"y\":2.1088075631936727,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":-1.5707963267948963},\"quaternion\":{\"x\":0,\"y\":0,\"z\":-0.7071067811865475,\"w\":0.7071067811865477}},{\"id\":160,\"position\":{\"x\":2.5180308423769353,\"y\":1.7037948087943773,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":-0.0007963267961379878},\"quaternion\":{\"x\":0,\"y\":0,\"z\":-0.00039816338754858187,\"w\":0.9999999207329553}},{\"id\":110,\"position\":{\"x\":4.363383838660308,\"y\":1.8446611590397413,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":-0.6207963216517365},\"quaternion\":{\"x\":0,\"y\":0,\"z\":-0.30543779417332834,\"w\":0.9522120320026057}},{\"id\":150,\"position\":{\"x\":0.38423754919784114,\"y\":2.8821267664956207,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":0.12920367633817348},\"quaternion\":{\"x\":0,\"y\":0,\"z\":0.06455691268644366,\"w\":0.9979140268702484}},{\"id\":179,\"position\":{\"x\":1.6566218773145178,\"y\":0.6982262358268683,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":-0.3207963322474933},\"quaternion\":{\"x\":0,\"y\":0,\"z\":-0.15971127443568203,\"w\":0.9871637700088726}},{\"id\":116,\"position\":{\"x\":0.7876551977953973,\"y\":1.0447069865075296,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":0.4692036732051035},\"quaternion\":{\"x\":0,\"y\":0,\"z\":0.2324557474516606,\"w\":0.9726069737960394}},{\"id\":123,\"position\":{\"x\":0.2772290873919028,\"y\":0.450067813046513,\"z\":0},\"rotation\":{\"x\":0,\"y\":0,\"z\":0.9792036732051036},\"quaternion\":{\"x\":0,\"y\":0,\"z\":0.47027453822665294,\"w\":0.8825201746678136}}]\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10013';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "room_id": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(188,188)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10014';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "label_ids": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(36,36)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10015';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "displayorder": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(0,0)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10016';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "model_ids": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"157,37,37,64,160,110,150,179,116,123\",\"157,37,37,64,160,110,150,179,116,123\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10017';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "style": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"\u73b0\u4ee3\",\"\u73b0\u4ee3\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10018';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "updator": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"\",\"\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10019';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "advert_text": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"\",\"\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10020';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "brand_id": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(1,1)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10021';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "pic_resids": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"\",\"\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10022';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "brand": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"Carlhansen&son\",\"Carlhansen&son\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10023';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "owner_id": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(0,0)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10024';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "category": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"\u5c55\u5385\",\"\u5c55\u5385\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10025';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "advert_author": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"\",\"\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10026';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "create_time": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(1431681119,1431681119)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10027';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "adv_top": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"\",\"\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10028';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "scene_id": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(267,267)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10029';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "remark": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(\"\",\"\")";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10030';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "isfav": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(0,0)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10031';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "category_id": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(19,19)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10032';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "area": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(12,12)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10033';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "update_time": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(1431920552,1431920552)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10034';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        },
        "pics": {},
        "from_id": function() {
            var window = function() {
                return this;
            } ();
            function geneVal(key) {
                var o = __rap__context__[key];
                var arr = o.arr;
                return arr[o.index++%arr.length];
            }
            if (!window.__rap__context__) {
                window.__rap__context__ = {};
            }
            var orderCmd = "$order(0,0)";
            var orderArr = eval('[' + orderCmd.substring(7, orderCmd.length - 1) + ']');
            var key = '10035';
            if (!__rap__context__[key]) {
                __rap__context__[key] = {
                    arr: orderArr,
                    index: 0
                };
            }
            return geneVal(key);
        }
    }]
}

0.1.1版本MockJS出现Mock错误

// 错误样本,报错:RangeError: Maximum call stack size exceeded

var data = ({"msg":1,"hostName":"newbpfe6.vm.kgb.cm3","code":"200","result":{"totalItem":"14","toPage":"1","pageSize":"200","items|10":[{"adGroupDTO":{"nsMaxPriceGtLimitPrice":1,"adGroupId|+1":10000,"createTime":"20140310172955","onlyUpdateNsMaxPrice":1,"outsideItemPrice":"30000.00","outsideItemExpireTime":"20500101000000","defaultPrice":"5","plState":1,"redirectState":1,"outsideItemNumId":"36763870637","nonsearchState":"1","customerId":"1106887486","lastSyncDate":1,"displayOnlineState":"1","linkUrl":"http://item.taobao.com/item.htm?id=36763870637","title":"@title","outsideKey":1,"garbageState":1,"displayDefaultPrice":"0.05","campaignId|1000-9999":"13582395","properties":1,"outsideItemStrId":1,"nonsearchIsDefaultPrice":"0","adgroupType":1,"lastUpdateTime":"20140310172955","imgUrl":"http://gtms01.alicdn.com/tps/i1/T1icQqFipbXXaKKqDm-70-70.jpg","limitPrice":1,"onlineState":"1","nick":1,"extension":1,"nonsearchMaxPrice":"100","offlineType":"0","categoryId|10000-99999":"16 50010850","isCatMatchOnline":1,"extStatus":1,"reason":1,"outsideItemState":"1"},"campaignTitle":"定向推广用-千万别改设置平台!!!2!!","displayOnlineState":"1","fullImgUrl":"http://img.taobaocdn.com/bao/uploaded/i2/T1Wd0sFBVeXXXXXXXX_!!0-item_pic.jpg","adGroupCreativeState":"1","catPathNames":1}]}})

Mock.mock(data);

TODO

  1. √ Handlebars vs XTemplate,测试、语法
  2. √ 占位符:支持转义 @
  3. 50% 在测试用例增加期望的断言个数
  4. {{#}} {{^}} 的冲突
  5. 嵌套占位符:支持设置参数
  6. √ 嵌套占位符:支持为不同路径设置不同的占位符
  7. 增加对 URL 中参数 mock 的判断
  8. √ 文档:如何扩展占位符

Mock.toJSONSchema( template )

规则映射

rule String Number Boolean Object Array Function RegExp
min
max
dmin
dmax
step

Mock.mock(rurl, rtype, template)

目前 Mock.mock() 支持的方法签名有:

  • Mock.mock(template)
  • Mock.mock(rurl, template)

@chongzhi 建议增加一个参数 rtype,以区分相同 URL 但是请求类型(GET、POST、PUSH、DELETE等)不同的场景,即支持 RESTFul 风格的 API:

  • Mock.mock(rurl, rtype, template)

无法引用数据模板中的属性

例如下面的数据模板:

{
    name: '@first @last',
    first: 'fffff',
    last: 'lllll'
}

生成的数据应该是:

{
    name: 'fffff lllll',
    first: 'fffff',
    last: 'lllll'
}

而实际上生成的是:

{
    name: 'William Garcia',
    first: 'fffff',
    last: 'lllll'
}

即没有引用数据模板中的属性 firstlast,仍然通过 Random.first()Random.last() 生成了模拟数据。

补充

  1. 如果属性 firstlastname 之前,则会引用,生成的数据符合期望,如下所示:

    {
        first: 'fffff',
        last: 'lllll',
        name: '@first @last'
    }
  2. 如果引用的属性尚不存在,而且在 Random 中也没有同名方法,则会报错。

能否添加函数或动态数据功能?

http://www.json-generator.com/

现在我这边目前又遇到一个问题,


    var names = ["福州", "泉州", "厦门"];
    var area = {
        '福州': ['鼓楼区', '台江区', '马尾', '仓山'], 
        '泉州': ['丰泽区', '泉港区', '惠安县', '安溪县'], 
        '厦门': ['海沧区', '湖里区', '集美区', '同安区']
    };

        "data|20-30": [{
            "_id|+1": 1,
            "city_name|1": names,
            "name|1": area["@city_name"]
        }]

name为undifine

我在Handle对象添加了一个"function"处理函数:


Handle.extend({
    Random: Random,
    ......
    "function": function(options) {
        return options.template.apply(this, [options.obj]);
    }
});

这边还是有两个问题:

  1. 执行函数上下文没有考虑进去。
  2. 执行顺序(目前函数必须写在被依赖的数据后面)

使用时:


       "data|20-30": [{
            "_id|+1": 1,
            "city_name|1": names,
            "name": function(obj) {
                console.log(this.Random.pick(area[obj.city_name]));
            }
        }]

mock有没有延迟返回?

ajax请求,肯定有时延。而mock却是立刻返回结果,还是不够好。有延时返回的配置吗?

如何继续发送ajax请求

mockjs很好用,大赞!

使用过程,遇到以下场景,需根据头部决定是否拦截请求

因为接口与前端并行开发,某些接口完成后,不再需要mock data,直接发送请求。

请问mockjs是否支持该场景?应该怎么实现?

  Mock.mock(/index\.html/, function(options){
        var headers = options.headers, moduleName = headers["Module"];
        if(moduleName === "mainRecommend"){
            return mockMainRecommend();
        }else if (moduleName === "mainTop"){
            return mockMainList();
        }else{
            //继续发送ajax请求
        }
}

能否直接返回批量数组数据而不是一个对象?

因为项目居于backbone开发的,所以关于backbone.Collection的mock数据比较头疼。


[
    { ... },
    { ... }
    ...
]

目前mock似乎不支持上面数据结构的输出格式,只能手动一条一条添加,还是说我不知道?

想了下,可以换种方法:


var data = mock.mock({'data|5-10': [{ ... }]});
mock.mock(/url/, data.data);

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.