📜  Node.js 中的存根是什么?

📅  最后修改于: 2022-05-13 01:56:55.355000             🧑  作者: Mango

Node.js 中的存根是什么?

一个小程序例程,它替代了可能稍后加载或位于远程的较长程序。

存根的特点:

  • 存根可以是匿名的。
  • 存根可以包装到现有函数中。当我们将存根包装到现有函数中时,不会调用原始函数。
  • 存根是影响组件或模块行为的函数或程序。
  • 存根是用于测试的虚拟对象。
  • 存根实现预编程的响应。

例子:

var fs = require('fs')
var writeFileStub = sinon.stub(fs, 
    'writeFile', function (path, data, cb) {  
        return cb(null)
})
  
expect(writeFileStub).to.be.called  
writeFileStub.restore()  

何时使用存根?

  1. 防止直接调用特定方法。
  2. 控制从测试到强制代码的特定路径下的方法行为。例如:错误处理。
  3. 替换有问题的代码。
  4. 轻松测试异步代码。

创建引发异常的异步存根的示例:

require("@fatso83/mini-mocha").install();
  
const sinon = require("sinon");
const PubSub = require("pubsub-js");
const referee = require("@sinonjs/referee");
const assert = referee.assert;
  
describe("PubSub", function() {
   it("Calling all the subscribers, 
     irrespective of exceptions.", function() {
       const message = "an example message";
       const stub = sinon.stub().throws();
       const spy1 = sinon.spy();
       const spy2 = sinon.spy();
       const clock = sinon.useFakeTimers();
  
       PubSub.subscribe(message, stub);
       PubSub.subscribe(message, spy1);
       PubSub.subscribe(message, spy2);
  
       assert.exception(()=>{
           PubSub.publishSync(message, "some data");      
           clock.tick(1);
       });
  
       assert.exception(stub);
       assert(spy1.called);
       assert(spy2.called);
       assert(stub.calledBefore(spy1));
  
       clock.restore();
   });
});

输出:

Calling all the subscribers, irrespective of exceptions.

存根示例:让我们考虑一个用于购买商品的电子商务网站的示例。如果我们成功,将向客户发送一封邮件。

const purchaseItems(cartItems, user)=>{
   let payStatus = user.paymentMethod(cartItems)
   if (payStatus === "successful") {
     user.SuccessMail()
   } else {
     user.redirect("error_page_of_payment")
   }
 }
}
  
function() {
  
  // Mail will be send for successful payment.
  let paymentStub = sinon.stub().returns("successful")
  let mailStub = sinon.stub(
  let user = {
    paymentMethod: paymentStub,
    SuccessMail: mailStub
  }
  
  purchaseItems([], user)
   
  assert(mailStub.called)
}

示例 1:执行存根的简单示例。



  

    Page Title

  

    
  


  

    

  

输出:

示例 2:



  

    Page Title

  

    

GeeksForGeeks

    
  


  

    

  

输出: