Unit testing 不可能进行依赖注入时的单元测试/代码覆盖率

Unit testing 不可能进行依赖注入时的单元测试/代码覆盖率,unit-testing,dependency-injection,code-coverage,Unit Testing,Dependency Injection,Code Coverage,这个问题最好用代码来解释,所以假设您有一个名为myFancyLibrary.js的Javascript文件,它如下所示: var curl = require("node-curl"); var MyApiRequester = require("./MyApiRequester"); module.exports = { wasCalled: false, makeRequest: function(){ this.wasCalled = true;

这个问题最好用代码来解释,所以假设您有一个名为myFancyLibrary.js的Javascript文件,它如下所示:

var curl = require("node-curl");
var MyApiRequester = require("./MyApiRequester");

module.exports = {
    wasCalled: false,
    makeRequest: function(){
        this.wasCalled = true;
        var requester = new MyApiRequester( curl );
        requester.send();
    }
};
如您所见,curl是作为参数传递的,因此MyApiRequester的单元测试可以使用mock/stub,而不是实际发出curl请求

我的问题是,如何在不发出curl请求的情况下对makeRequest进行单元测试

我意识到您可以为myFancyLibrary.js创建一个包装器,并将MyApiRequester作为参数传入,但是包装器也会遇到同样的问题


最高级别的模块将不可避免地无法接收依赖注入的对象,因为没有地方可以接收它们。有什么办法可以解决这个问题吗?

如果目标是不在makeRequest函数中发送请求,那么您必须修改该函数以获得请求者接口,以便在测试中模拟它。考虑到这个函数非常小,您可能会看到收益递减,最好用一个函数测试来覆盖这个案例