Skip to content

Instantly share code, notes, and snippets.

@ThaddeusJiang
Created November 10, 2017 00:34
Show Gist options
  • Save ThaddeusJiang/b8bd6b1b437134410521b4fb405f837c to your computer and use it in GitHub Desktop.
Save ThaddeusJiang/b8bd6b1b437134410521b4fb405f837c to your computer and use it in GitHub Desktop.
如何写出可测试的 JS 代码

不好的例子

const db = require('db').connect();
const mailer = require('mailer');

module.exports.saveUser = (event, context, callback) => {
  const user = {
    email: event.email,
    created_at: Date.now()
  }

  db.saveUser(user, function (err) {
    if (err) {
      callback(err);
    } else {
      mailer.sendWelcomeEmail(event.email);
      callback();
    }
  });
};

问题

  1. 逻辑和业务耦合
  2. 依赖特定框架(db 和 mailer)

改善

class Users {
  constructor(db, mailer) {
    this.db = db;
    this.mailer = mailer;
  }

  save(email, callback) {
    const user = {
      email: email,
      created_at: Date.now()
    }

    this.db.saveUser(user, function (err) {
      if (err) {
        callback(err);
      } else {
        this.mailer.sendWelcomeEmail(email);
        callback();
      }
  });
  }
}

module.exports = Users;
const db = require('db').connect();
const mailer = require('mailer');
const Users = require('users');

let users = new Users(db, mailer);

module.exports.saveUser = (event, context, callback) => {
  users.save(event.email, callback);
};

首先业务逻辑分离到 Users, 其次db和mailer 通过参数传入,替换框架时不需要修改逻辑代码。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment