javascript - Sinon 如何 stub 内部使用的类的函数

标签 javascript node.js unit-testing sinon

我想了解是否可以使用 Sinon 来 stub 内部调用的另一个类的函数。

例如有一个 dbutil 类:

class DBUtils {
    getMyResult(var1, var2){
        return new Promise((resolve) => {
            console.log("calling real getMyResult");//I still see this in the log
            resolve(var1 + var2);
        });
    }
}
module.exports = DBUtils;

它在另一个类dummyService中被调用:

const dbUtils = new DBUtils();
class dummyService {
    getResult(var1, var2){
    //initially in my code, it returns a promise, 
    //but I have replaced it with your code
    return dbUtils.getMyResult(var1, var2).then(item =>{
        console.log("finish getting my result!");
        console.log("here is my result: " + item);
        return item; 
    });
}
module.exports = dummyService;

这是我的单元测试文件:(@Mark_M 建议的应用代码更改)

describe("dummy Test", function () {
var service = new DummyService();

const stub = sinon.stub(DBUtils.prototype, 'getMyResult');
stub.resolves("1234");    

it("get result", function() {
    service.getResult("ab", "cd").then(item => {
        console.log(item);
    });
});
});

任何人都可以帮助我理解为什么我的 stub 无法工作吗?以及如何在 dbUtil 类中 stub getMyResult 函数?

================解决方案==================

我错过了两件事:

  1. 我应该 stub DBUtils.prototype
sinon.stub(DBUtils.prototype, 'getMyResult').resolves("1234");
  • 在测试中导入 DBUtils 时出现拼写错误。
  • 在 dummyService 内部,我有

    const DBUtils = require(./dbutils);
    

    但是,在测试文件中,我有

    const DBUtils = require(./DBUtils);
    

    不知何故,sinon 没有提示这一点,这就是为什么我的 stub 从未在原始方法中注入(inject)......在我在测试中更正导入后,我可以看到 stub 结果现在被注入(inject)。

    最佳答案

    由于 getMyResult()DBUtils 类上的类方法,因此您需要 stub DBUtils 的原型(prototype)。像这样的事情:

    DBUtils.getMyResult() 返回一个 promise 。因此,您不需要将其重新包装在 dummyService.getResult() 中的 Promise 中。如果您只返回原始 promise ,那么推理(和测试)会变得更加容易:

    虚拟服务:

    const DBUtils = require('./DBUtils')
    
    class dummyService {
        getResult(var1, var2){
            const dbUtils = new DBUtils() // <- I assume you are making an instance somewhere
            return dbUtils.getMyResult(var1, var2).then(item =>{
                console.log("finish getting my result!");
                console.log("here is my result: " + item);
                return item // <- if you want to access item in then you need to return it
            });
        }
    }
    module.exports = dummyService;
    

    现在在 test.js 中:

    const DBUtils = require('./DBUtils')
    const DummyService = require('./dummy')
    const sinon = require('sinon')
    
    // stub the prototype
    const stub = sinon.stub(DBUtils.prototype, 'getMyResult')
    stub.resolves("Stubbed: 1234")
    
    // make an instance of the service
    const service = new DummyService()
    service.getResult("ab", "cd").then(item => {
        console.log(item)
        // this prints 'stubbed: 1234'
        // item is "abcd", which is the returned value of the real getMyResult method.
        // the expectation is, item should be "1234" as specified in the stub.
    });
    

    关于javascript - Sinon 如何 stub 内部使用的类的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46821232/

    相关文章:

    javascript - jQuery 在鼠标悬停时淡入

    javascript - 如何将所选属性添加到 Meteor Blaze 中的下拉选项标签?

    node.js - API 帖子,空主体对象

    javascript - NodeJS - 在特定路由上禁用 JSONP

    使用 new Date() 作为当前日期的 Java 单元测试方法

    javascript - 为什么使用原型(prototype)而不是方法

    javascript - 向侧面移动三 Angular 箭头

    node.js - Sequelize 原始查询未正确打印

    php - 用PHPUnit区分NULL和FALSE

    c# - 无法从用法中推断出方法的类型参数