V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qiu8310
V2EX  ›  Node.js

分享一个简单强大的生成测试数据的工具

  •  
  •   qiu8310 · 2015-04-28 07:40:01 +08:00 · 6833 次点击
    这是一个创建于 3286 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目地址

    源码地址

    在线演示

    背景

    • 前端程序员会因为后端没有接口数据,开发某些功能可能就不太方便
    • 后端程序员常会被前端程序员催促给接口,给数据

    用 yod-mock 解决

    使用它非常简单

    • 第一步定义结构类型:yod.type('xxx', {...})
    • 第二步使用你定义的类型生成随机的数据:yod('@xxx.repeat(10)')

    可以看个 DEOM

    // 定义一个用户类型
    yod.type('User', {
      firstName: '@First',
      myFirstNameLength: '@Self.firstName.length',
      lastName: '@Last',
      '@Self.lastName': 'is my family name',
      fullName: '@Self.firstName @Self.lastName',
      nickName: '@Nick',
      chineseName: '@ChineseName',
      age: '@Age(adult)',
      to100: '` 100 - @Self.age `',
      telephone: '@Tel',
      avatar: '@Avatar',
      others: {
         words: 'My name is @Parent.fullName,  call me @Parent.nickName.',
         bestFriends: '@Nick.repeat(2, 3).join(", ")',
         favouriteLetter: '@([A, B, C]).sample'
      }
    });
    
    // 重复生成 2 - 4 个用户
    console.log(yod('@User.repeat(2, 4)'));
    

    它会用你定义的 User 结构体去生成一个数组,包含 2-4 个 User

    你可以在线查看或修改上面的 DEMO

    yod-mock 的主要特点

    • 语法简洁,学习成本低,功能强大
    • 支持所有 JS 原生的函数
    • 支持所有 lodash 的函数
    • 支持处定义新的 type 和 modifier
    • 支持配置系统现有的数据(使用 yod.config('system.xxx', ...) )
    • 支持在浏览器、NodeJS 或 命令行上使用
    24 条回复    2015-06-06 15:02:01 +08:00
    endoffight
        1
    endoffight  
       2015-04-28 07:42:16 +08:00 via Android
    下次前端再催我,我就给他看这个
    qiu8310
        2
    qiu8310  
    OP
       2015-04-28 10:48:33 +08:00
    @endoffight 哈哈,赞。不过记得要先由后台确认好数据的结构。
    kepenj
        3
    kepenj  
       2015-04-28 12:17:47 +08:00
    下次后端在没有,我就给他看这个
    lincanbin
        4
    lincanbin  
       2015-04-28 12:26:11 +08:00
    以前我就是这样的,先放一些假数据给前端用着先——直接按照文档放数据上去。
    另外node.js作为后端,在国内并不多见。
    Mcatt
        5
    Mcatt  
       2015-04-28 12:48:47 +08:00
    好东西,下次试用一下
    qiu8310
        6
    qiu8310  
    OP
       2015-04-28 13:20:41 +08:00
    @lincanbin 嗯,是的,这是个问题。

    不过此版本是支持游览器上直接 Mock 数据的,不需要后台,如果用 jquery 可以用它自带的 ajaxBefore 劫持请求,生成 mock 数据。

    另外,我是有计划写个后端的网站程序来支持此工具。
    Nick
        7
    Nick  
       2015-04-28 13:45:06 +08:00
    躺着被@
    whwei
        8
    whwei  
       2015-04-28 13:51:19 +08:00
    写过一个响应指定数据的服务器,正好缺这样一个工具产生 mock 数据,感觉 LZ 这个比 mockjs 简单直接好多。。已 star。
    qiu8310
        9
    qiu8310  
    OP
       2015-04-28 14:21:54 +08:00
    @whwei 我就是用 mockjs 不爽才想到自己写一个的。 你的的响应指定数据的服务器是 open sourced 的吗?
    qiu8310
        10
    qiu8310  
    OP
       2015-04-28 14:22:53 +08:00
    @Nick 哈哈。。。说明你更应该用它
    fising
        11
    fising  
       2015-04-28 14:25:01 +08:00
    Fiddler 不就行了么
    zlexdl
        12
    zlexdl  
       2015-04-28 14:44:25 +08:00
    看样子挺好的,暂时用不上,给你一个星,留着以后用。
    whwei
        13
    whwei  
       2015-04-28 14:50:09 +08:00
    @qiu8310 是,其实就是一个 express 写的服务器,因为就自己用用,文档什么都还没写。https://github.com/whwei/mockserver
    thisnull
        14
    thisnull  
       2015-04-28 23:55:48 +08:00
    正好需要这个.
    qiu8310
        15
    qiu8310  
    OP
       2015-04-29 07:29:49 +08:00
    @whwei 谢谢,可以参考下。 我后期打算做个类似的服务端放到 heroku 或 bae 上给普通用户用,这样他们可以直接 ajax 请求远程服务,就不用在本地 mock 了。

    不过最近太忙了,不知道什么时候可以腾出时间来做。
    qiu8310
        16
    qiu8310  
    OP
       2015-04-29 07:32:06 +08:00
    @fising fiddler 还是需要你手动定义好替换文件吧,它的文件内容只有你改动才会变化。

    用 yod-mock 生成的内容都是随机变化的,而且接近真实数据(我是爬了一些论坛的数据)。
    qiu8310
        17
    qiu8310  
    OP
       2015-05-01 08:00:06 +08:00
    更新了一个版本,添加了测试,并且修复了上一个版本中的一些很明显的问题!
    burgleaf
        18
    burgleaf  
       2015-06-03 23:35:15 +08:00
    yod.type('User', {
    firstName: '@First',
    lastName: '@Last',
    sex: '@Sex',
    fullName: '@Self.firstName @Self.lastName',
    nickName: '@Nick',
    chineseName: '@ChineseName',
    age: '@Age(adult)',
    to100: '` 100 - @Self.age `', // 执行 JS 语句
    telephone: '@Tel',
    avatar: '@Avatar',
    others: {
    words: 'Hello, my name is @Parent.fullName, you can call me @Parent.nickName.',
    bestFriends: '@Nick.repeat(2, 3).join(", ")',
    myFirstNameLength: '@Parent.firstName.length',
    favouriteLetter: '@([A, B, C]).sample',
    nc:{nike:['@Nick']}
    }
    });

    @qiu8310 处理这样的结构 nc:{nike:['@Nick']} 会出问题,不知道什么情况
    qiu8310
        19
    qiu8310  
    OP
       2015-06-05 16:55:24 +08:00
    @burgleaf 我测试没有问题,你复制到 [http://qiu8310.github.io/yod-mock/](http://qiu8310.github.io/yod-mock/) 这里看下
    qiu8310
        20
    qiu8310  
    OP
       2015-06-05 16:56:18 +08:00
    @burgleaf url 写错了,以为它用了 markdown,重发一下地址: http://qiu8310.github.io/yod-mock/
    burgleaf
        21
    burgleaf  
       2015-06-05 21:55:42 +08:00   ❤️ 1
    yod.type('User', {
    firstName: '@First',
    lastName: '@Last',
    sex: '@Sex',
    fullName: '@Self.firstName @Self.lastName',
    nickName: '@Nick',
    chineseName: '@ChineseName',
    age: '@Age(adult)',
    to100: '` 100 - @Self.age `', // 执行 JS 语句
    telephone: '@Tel',
    avatar: '@Avatar',
    others: {
    words: 'Hello, my name is @Parent.fullName, you can call me @Parent.nickName.',
    bestFriends: '@Nick.repeat(2, 3).join(", ")',
    myFirstNameLength: '@Parent.firstName.length',
    favouriteLetter: '@([A, B, C]).sample',
    nc:[{nike:'@Nick'},{cName:'@ChineseName'}]
    }
    });


    // 重复生成 2 - 4 个用户
    console.log(yod({
    status: 'ok',
    list: '@User.repeat(2, 4)'
    }))


    是这样有问题。。nc:[{nike:'@Nick'},{cName:'@ChineseName'}] 我也发错了
    burgleaf
        22
    burgleaf  
       2015-06-05 21:56:12 +08:00
    Nick
        23
    Nick  
       2015-06-05 22:35:59 +08:00 via iPhone
    又躺着被@ T_T
    qiu8310
        24
    qiu8310  
    OP
       2015-06-06 15:02:01 +08:00
    @burgleaf 谢谢指出问题,是我没处理数组中的对象,已经更新了,你可以看 http://qiu8310.github.io/yod-mock/

    你只要删除现在的 yod-mock 模块,重新安装即可(yod-mock 的代码没改,主要是改了它的核心模块 https://github.com/qiu8310/yod 的代码)

    PS: 有什么好的建议随时可以告诉我!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2757 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:22 · PVG 23:22 · LAX 08:22 · JFK 11:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.