我有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吗?
答案 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
});
关键是在被测对象(午餐)需要它之前,需要您的依赖(墨西哥玉米煎饼),以便您有时间伪造它。