如何编写返回异步的API调用的简单模拟

时间:2018-08-17 19:41:04

标签: javascript node.js

有一个示例应用程序具有一个db Node Node JS库,但是我的服务器当前未安装db db,因此我不需要它。

如何编写一个简单的类来模拟API调用。

store变量是我要模拟的库,它具有2个API调用:

  store.put   
  store.get

它有2个API调用:

const store = level('./data/dbname123', { valueEncoding: 'json' });

save() {
  debug(`saving id: ${this.id}`);
  const properties = attributes.reduce((props, attr) => {
    props[attr] = this[attr];
    return props;
  }, { fields: this.fields });
  return new Promise((resolve, reject) => {
    store.put(this.id, properties, (error) => {
      if (error) { return reject(error); }
      resolve(this);
    });
  });
}


 static find(id) {
    debug(`fetching id: ${id}`)
    return new Promise((resolve, reject) => {
      store.get(id, (error, properties) => {
        if (error) { return reject(error); }
        resolve(new Ticket(properties));
      });
    });
  }

我该如何快速嘲笑那些?我不太熟悉这种JavaScript样式,但是由于Promise包装程序的原因,我不确定这是异步调用还是?

2 个答案:

答案 0 :(得分:1)

您可以在对象上创建具有putget方法的对象,以模拟这些方法的作用。只需确保您的函数遵循预期的约定即可,例如,如果出现问题,则以错误作为第一个参数调用回调。

显然,这可能涉及更多,并且Sinon之类的工具可以帮助您模拟现有功能。

例如:

// simple mocks for store.get and store.put
let store = {
    put(id, properties, fn){
        // add whatever behavior you need and call callback fn
        fn(null) // calling with null indicates no error. 
    },
    get(id, fn){
        // make some properties
        let props = {
            someProperties: "Hello",
            id: id
        }
        // call callback
        fn(null, props)
    }
}


function save() {
    return new Promise((resolve, reject) => {
      store.put('id', 'properties', (error) => {
        if (error) { return reject(error); }
        resolve();
      });
    });
  }
  
function find(id) {
      return new Promise((resolve, reject) => {
        store.get(id, (error, properties) => {
          if (error) { return reject(error); }
          resolve(properties);
        });
      });
    }

// try them out

find("21")
.then(console.log)

save()
.then(() => console.log("done"))

答案 1 :(得分:1)

也许我的答案与您的问题不符,但是要模拟您的库,您可以创建自己的存储空间

const store = function () {
  var data = {};

  return {
    put: function(id, props, fn) {
       data[id] = props;
       fn(null);
    },
    get: function(id, fn) {
      fn(null, data[id]);
    } 
  }
}();

如果您定义存储空间,就可以模拟库