【问题标题】:Mock an instance of a module NodeJs模拟一个模块 NodeJs 的实例
【发布时间】:2014-12-20 17:11:52
【问题描述】:

如何在我正在测试的方法中模拟 module 的实例?

方法示例:

var item = require('item'); // module to mock

// underTest.js
module.exports = {

    parse: function(model) {
       return new item(model).parse();
    }

}

我想模拟 item 模块并断言 parse 方法已被调用。

我的测试套件使用 sinonmocha 任何示例来实现这一点将不胜感激。

【问题讨论】:

    标签: node.js mocking sinon


    【解决方案1】:

    也许你可以通过扩展原型来创建一个 Mock

    // yourmock.js
    var item = require("item")
    
    exports = item
    exports.parse = function() {
       //Override method
    }
    

    编辑

    一个例子。您有一个请求外部 API 的 NodeJS 应用程序。例如我们有 Stripe 来完成信用卡支付。此付款由 payment.js 对象完成,其中有一个 processPayment 方法。您希望 boolean 在回调中返回。

    原始文件可能如下所示:

    // payment.js
    exports.processPayment = function(credicardNumber, cvc, expiration, callBack) {
       // logic here, that requests the Stripe API
       // A long time processing and requesting etc.
       callback(err, boolean)
    }
    

    因为您希望在测试期间处理条带没有问题,所以您需要模拟此函数,以便可以在没有任何请求服务器延迟的情况下使用它。

    您可以做的是使用相同的功能,但您接管了请求服务器的功能。因此,在真实环境中,您期望一个带有错误和布尔值的回调,这个模拟将为您提供。

    // paymentMock.js
    var payment = require('./payment');
    
    // exports everything what normally is inside the payment.js functionality
    exports = payment
    
    // override the functionality that is requesting the stripe server
    exports.processPayment = function(creditCardNumber, cvc, expirationDate, callBack) {
       // now just return the callback withouth having any problems with requesting Stripe
       callBack(null, true);
    } 
    

    这对你来说可能更容易理解吗?

    【讨论】:

    • 非常感谢保罗,但我对节点测试比较陌生,请你给我一个例子,告诉我你是如何测试这个小方法的。您认为正确的方法是覆盖他的默认方法以做出期望吗?干杯
    • @Fabrizio 我已经编辑了答案,也许你会更了解我试图向你解释的内容?
    猜你喜欢
    • 2021-06-10
    • 2017-05-05
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    相关资源
    最近更新 更多