我有两个文件controller.js和entity.js,它们相互作用。我正在测试controller.js,它创建了entity.js(类(的一个实例并使用它的一个函数。我如何存根/mok/speey调用和该方法的返回?
控制器.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吗?
Sinon将很乐意存根该函数。由于这是一个类方法,您只需要确保在原型上存根函数:
const controller = async (req, res) => {
const entity = new Entity();
const validation = await entity.validate();
console.log(validation)
};
class Entity{
constructor() {}
async validate() {
return "real function";
}
}
// stub it
let stub = sinon.stub(Entity.prototype, 'validate')
stub.returns('stubbed function')
controller()
<script src="https://cdnjs.cloudflare.com/ajax/libs/sinon.js/7.1.1/sinon.min.js"></script>
此解决方案使用Ava(但您应该能够轻松适应Mocha(。不过,我更熟悉testdouble。如果你在西农没有成功(我相信你会的(,这里有一个你可能想考虑的替代方案。
所以如果我们有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
});
关键是在你的受试者(你的午餐(需要之前需要你的依赖性(墨西哥卷饼(,这样你就有时间伪造它