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()
何时使用存根?
- 防止直接调用特定方法。
- 控制从测试到强制代码的特定路径下的方法行为。例如:错误处理。
- 替换有问题的代码。
- 轻松测试异步代码。
创建引发异常的异步存根的示例:
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
输出: