存根另一个函数的类调用

时间:2018-11-16 16:23:13

标签: javascript node.js sinon chai supertest

我有2个文件controller.js和Entity.js相互交互。我正在测试controller.js,它会创建一个entity.js(类)的实例并使用其功能之一。如何存根/模拟/监视该方法的调用和返回?

controller.js

const controller= async (req, res) => {

try {
    ...

    const entity = new Entity({
    ...
    });

    const validation = await entity.validate();

    ...
    return res.send()
    }
  } catch (error) {
    return res.send(error)
  }
};

Entity.js

class Entity{
  constructor() {
  ...
  }

  ...

  async validate() {
    ...
    return response;
  }
}

有什么想法如何使用supertest,sinon和chai测试controller.js吗?

2 个答案:

答案 0 :(得分:1)

Sinon会很高兴地对该功能进行存根。由于它是一个类方法,因此您只需要确保将函数存入原型即可即可。

<script src="https://cdnjs.cloudflare.com/ajax/libs/sinon.js/7.1.1/sinon.min.js"></script>
grep

答案 1 :(得分:0)

此解决方案使用Ava(但您应该能够轻松适应Mocha)。但是我对testdouble更加熟悉。如果您在使用sinon方面没有成功(我相信您会成功),那么您可以考虑以下替代方法。

因此,如果我们有burrito.js

module.exports = class {
   eat() {
      return '';
   }
};

还有lunch.js

var Burrito = require('./burrito');
module.exports = () => (new Burrito()).eat();

然后在您的测试中:

const td = require('testdouble');
const test = require('ava');

test('swap burrito', t => {

  td.replace('./burrito', class FakeBurrito  {
    eat() {
      return '';
    }
  });

  const lunch = require('./lunch');

  t.is(lunch(), ''); // PASS
  t.is(lunch(), ''); // FAIL
});

关键是在被测对象(午餐)需要它之前,需要您的依赖(墨西哥玉米煎饼),以便您有时间伪造它。