• 前端隔离测试


    目的

    当前端开发过程中,需要输出来填充页面时候,或者后台交互时候,需要后台准备假数据服务器。

    这个时候,使用mysql等后台工具,则工作量太大。

    工具引入 mockjs -- 模拟随机数据

    http://mockjs.com/0.1/

    Mock.js 是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试。提供了以下模拟功能:

    • 根据数据模板生成模拟数据
    • 模拟 Ajax 请求,生成并返回模拟数据
    • 基于 HTML 模板生成模拟数据

    工具引入 jsonserver -- 与mockjs不同, 其实后台可设置, 可记忆更新状态的

    https://github.com/typicode/json-server

    Get a full fake REST API with zero coding in less than 30 seconds (seriously)

    Created with <3 for front-end developers who need a quick back-end for prototyping and mocking.

    npm install -g json-server

    Create a db.json file with some data

    {
      "posts": [
        { "id": 1, "title": "json-server", "author": "typicode" }
      ],
      "comments": [
        { "id": 1, "body": "some comment", "postId": 1 }
      ],
      "profile": { "name": "typicode" }
    }

    Start JSON Server

    json-server --watch db.json

    Now if you go to http://localhost:3000/posts/1, you'll get

    { "id": 1, "title": "json-server", "author": "typicode" }

    Also when doing requests, it's good to know that:

    • If you make POST, PUT, PATCH or DELETE requests, changes will be automatically and safely saved to db.json using lowdb.
    • Your request body JSON should be object enclosed, just like the GET output. (for example {"name": "Foobar"})
    • Id values are not mutable. Any id value in the body of your PUT or PATCH request will be ignored. Only a value set in a POST request will be respected, but only if not already taken.
    • A POST, PUT or PATCH request should include a Content-Type: application/json header to use the JSON in the request body. Otherwise it will result in a 200 OK but without changes being made to the data.

    自己动手

    在vue项目的基础上, 添加mockjs

    https://www.jianshu.com/p/27b2767b4193

    另外添加jsonserver

    https://github.com/fanqingsong/code-snippet/tree/master/web/mockjs/test

    mock.js

    import Mock from 'mockjs';
    
    export default Mock.mock('http://g.cn', {
        'name'    : '@name',
        'age|1-100': 100,
        'color'    : '@color'
    });

    db.json (json server)

    {
      "posts": [
        {
          "id": 1,
          "title": "json-server",
          "author": "typicode"
        },
        {
          "id": 3,
          "title": "a new title birthed."
        },
        {
          "title": "a new title birthed.",
          "id": 4
        },
        {
          "title": "a new title birthed.",
          "id": 5
        },
        {
          "title": "a new title birthed.",
          "id": 6
        },
        {
          "title": "a new title birthed.",
          "id": 7
        },
        {
          "title": "a new title birthed.",
          "id": 8
        },
        {
          "title": "a new title birthed.",
          "id": 9
        },
        {
          "title": "a new title birthed.",
          "id": 10
        },
        {
          "title": "a new title birthed.",
          "id": 11
        },
        {
          "title": "a new title birthed.",
          "id": 12
        },
        {
          "title": "a new title birthed.",
          "id": 13
        }
      ],
      "comments": [
        {
          "id": 1,
          "body": "some comment",
          "postId": 1
        }
      ],
      "profile": {
        "name": "typicode"
      }
    }

    App.vue

    <template>
      <div id="app">
        girls info:
        <div>name: {{girl_props.name}}</div>
        <div>age: {{girl_props.age}}</div>
        <div>color: {{girl_props.color}}</div>
    
        <hr>
        <button @click="addpost">add new post</button>
        her posts json:
        <div>
          <ul>
            <li v-for="post of posts">{{post.title}}</li>
          </ul>
        </div>
      </div>
    </template>
    
    <script>
    import data from '../utils/mock';
    
    import axios from 'axios';
    
    import HelloWorld from './components/HelloWorld'
    
    export default {
      name: 'App',
      components: {
        HelloWorld
      },
      data(){
        return {
          girl_props: {},
          posts: [],
          errors: []
        }
      },
      methods:{
        addpost: function(){
          axios.post('http://localhost:3000/posts', {
            title: "a new title birthed."
          })
          .then(response => {
            axios.get('http://localhost:3000/posts')
            .then(response => {
              this.posts = response.data
            })
          })
          .catch(e => {
            this.errors.push(e)
          })
        }
      },
      created: function(){
        axios.get('http://g.cn')
        .then(response => {
          // JSON responses are automatically parsed.
          this.girl_props = response.data
          console.log(response.data);
        })
        .catch(e => {
          this.errors.push(e)
        })
    
        axios.get('http://localhost:3000/posts')
        .then(response => {
          // JSON responses are automatically parsed.
          this.posts = response.data
          console.log(response.data);
        })
        .catch(e => {
          this.errors.push(e)
        })
    
      }
    }
    </script>
    
    <style>
    #app {
      font-family: 'Avenir', Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;
    }
    </style>

    package.json

    {
      "name": "test",
      "version": "1.0.0",
      "description": "A Vue.js project",
      "author": "fanqingsong <qsfan@qq.com>",
      "private": true,
      "scripts": {
        "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
        "start": "npm run dev",
        "build": "node build/build.js",
        "json-server": "json-server --watch ./utils/db.json"
      },
      "dependencies": {
        "axios": "^0.18.0",
        "json-server": "^0.14.0",
        "vue": "^2.5.2"
      },
      "devDependencies": {
        "autoprefixer": "^7.1.2",
        "babel-core": "^6.22.1",
        "babel-helper-vue-jsx-merge-props": "^2.0.3",
        "babel-loader": "^7.1.5",
        "babel-plugin-syntax-jsx": "^6.18.0",
        "babel-plugin-transform-runtime": "^6.22.0",
        "babel-plugin-transform-vue-jsx": "^3.5.0",
        "babel-preset-env": "^1.3.2",
        "babel-preset-stage-2": "^6.22.0",
        "chalk": "^2.0.1",
        "copy-webpack-plugin": "^4.0.1",
        "css-loader": "^0.28.0",
        "extract-text-webpack-plugin": "^3.0.0",
        "file-loader": "^1.1.4",
        "friendly-errors-webpack-plugin": "^1.6.1",
        "html-webpack-plugin": "^2.30.1",
        "mockjs": "^1.0.1-beta3",
        "node-notifier": "^5.1.2",
        "optimize-css-assets-webpack-plugin": "^3.2.0",
        "ora": "^1.2.0",
        "portfinder": "^1.0.13",
        "postcss-import": "^11.0.0",
        "postcss-loader": "^2.0.8",
        "postcss-url": "^7.2.1",
        "rimraf": "^2.6.0",
        "semver": "^5.3.0",
        "shelljs": "^0.7.6",
        "uglifyjs-webpack-plugin": "^1.1.1",
        "url-loader": "^0.5.8",
        "vue-loader": "^13.7.2",
        "vue-style-loader": "^3.0.1",
        "vue-template-compiler": "^2.5.2",
        "webpack": "^3.6.0",
        "webpack-bundle-analyzer": "^2.9.0",
        "webpack-dev-server": "^2.9.1",
        "webpack-merge": "^4.1.0"
      },
      "engines": {
        "node": ">= 6.0.0",
        "npm": ">= 3.0.0"
      },
      "browserslist": [
        "> 1%",
        "last 2 versions",
        "not ie <= 8"
      ]
    }

    npm run json-server

    npm run dev

    横线上为mockjs测试

    横线下为 jsonserver测试, 点击add 则会新增文章,刷新也会保存。

     

  • 相关阅读:
    博客开篇--别让自己在临终前后悔
    预言帖,WP7迟早有一天会失败
    sql server 列值转列名的问题
    “《面对面做好每一天》中国短道速滑教练李琰”读后感
    原型要做到什么程度
    不得不承认我的高度不够,通过项目提升了.
    项目进度很慢
    原型确认后准备开发(1)
    邮件发送打印机更改打印机连接的通知
    onclick事件中加href
  • 原文地址:https://www.cnblogs.com/lightsong/p/9478595.html
Copyright © 2020-2023  润新知