gpt4 book ai didi

javascript - 使用 Mocha、Chai、chaiAsPromised 和 Sinon 测试 js promises

转载 作者:行者123 更新时间:2023-11-28 21:25:22 26 4
gpt4 key购买 nike

我正在尝试测试一个读取文件并返回包含文件内容的 promise 的函数。

function fileContents(){
return new Promise(function(resolve, reject) {
fs.readFile(filename, function(err, data){
if (err) { reject(err); }
else { resolve(data); }
});
});
}

上面的单元测试

describe('Testing fileContents', function () {

afterEach(function () {
fs.readFile.restore();
});

it('should return the contents of the fallBack file', function () {
let fileContents = '<div class="some-class">some text</div>';

sinon.stub(fs, 'readFile').returns(function(path, callback) {
callback(null, fileContents);
});

let fileContentsPromise = fileContents();

return fileContentsPromise
.then(data => {
expect(data).to.eventually.equal(fileContents);
});

});

上面的测试错误

 Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

我也试过

describe('Testing fileContents', function () {

afterEach(function () {
fs.readFile.restore();
});

it('should return the contents of the fallBack file', function (done) {
let fileContents = '<div class="some-class">some text</div>';

sinon.stub(fs, 'readFile').returns(function(path, callback) {
callback(null, fileContents);
});

let fileContentsPromise = fileContents();

fileContentsPromise.then(function(data){
expect(data).to.equal(fileContents);
done();
});
});

同样的错误。该功能在我的本地站点上运行,但我不知道如何为其编写测试。我是js的新手。我错过了什么?

最佳答案

您的代码存在多个问题。例如,您在测试中重新声明 fileContents 并为其分配一个字符串值,这当然不适用于在同一测试中执行 fileContents() 。我将专注于两个概念性问题,而不是像这个这样的“duh”类型的错误。

这两个概念性问题是:

  1. 要让 fs.readFile 使用假值调用您的回调,您必须使用 .yields。使用 .returns 更改您不使用的返回值。所以像这样 stub :

    sinon.stub(fs, 'readFile').yields(null, fakeContents);
  2. 您正在非 promise 上使用 chai-as-promised 提供的 .eventually 功能,但您必须在 promise 上使用它它才能正常工作,所以你的测试应该是:

    return expect(fileContentsPromise).to.eventually.equal(fakeContents);

这是有效的代码:

const sinon = require("sinon");
const fs = require("fs");
const chai = require("chai");
const chaiAsPromised = require("chai-as-promised");
chai.use(chaiAsPromised);

const expect = chai.expect;

// We need to have filename defined somewhere...
const filename = "foo";
function fileContents(){
return new Promise(function(resolve, reject) {
fs.readFile(filename, function(err, data){
if (err) { reject(err); }
else { resolve(data); }
});
});
}

describe('Testing fileContents', function () {

afterEach(function () {
fs.readFile.restore();
});

it('should return the contents of the fallBack file', function () {
let fakeContents = '<div class="some-class">some text</div>';

sinon.stub(fs, 'readFile').yields(null, fakeContents);

let fileContentsPromise = fileContents();

return expect(fileContentsPromise).to.eventually.equal(fakeContents);
});
});

关于javascript - 使用 Mocha、Chai、chaiAsPromised 和 Sinon 测试 js promises,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42192715/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com