使用sinon存根fs.promises.readFile

问题描述

我在node.js中有这个fn,它从文件中读取json数据。

async getAllProducts() {
        try {
            return JSON.parse(await fs.promises.readFile("data/products.json"));
        } catch (error) {
            if (error.message === "Unexpected end of JSON input") {
                throw new noproductsExistError("The File is Empty");
            }
            throw new FileReadingError("Error Reading File");
        }
    }

我正在尝试对方法进行存根。到目前为止,这是我的代码

const chai = require("chai");
const expect = chai.expect;
const sinon = require("sinon");
const dao = require("./dao");
const fs = require("fs");

describe("getAllProducts",() => {
    it("should return all products",() => {
        sinon
            .stub(fs.promises,"readFile")
            .withArgs("data/products.json")
            .returns(
                JSON.stringify([
                    {
                        productId: 101,productName: "Sony XB450AP Wired Headset"
                    },{
                        productId: 102,productName: "Sony XB950"
                    }
                ])
            );

        expect(dao.getAllProducts()).to.equal([
            {
                productId: 101,productName: "Sony XB450AP Wired Headset"
            },{
                productId: 102,productName: "Sony XB950"
            }
        ]);
    });
});

但是当我在配置了mocha的情况下运行npm test时,我得到了

 1) getAllProducts
       should return all products:
     AssertionError: expected {} to equal [ Array(2) ]
      at Context.<anonymous> (data\dao.spec.js:27:35)
      at processImmediate (internal/timers.js:458:21)

不确定如何解决此问题。任何帮助都非常感激

解决方法

NM,我知道了...

正确的代码

const chai = require("chai");
const expect = chai.expect;
const sinon = require("sinon");
const dao = require("./dao");
const fs = require("fs");

describe("getAllProducts",() => {
    it("should return all products",*async* () => {
        sinon
            .stub(fs.promises,"readFile")
            .withArgs("data/products.json")
            .returns(
                JSON.stringify([
                    {
                        productId: 101,productName: "Sony XB450AP Wired Headset"
                    },{
                        productId: 102,productName: "Sony XB950"
                    }
                ])
            );

        expect(*await* dao.getAllProducts()).to.*deep*.equal([
            {
                productId: 101,productName: "Sony XB450AP Wired Headset"
            },{
                productId: 102,productName: "Sony XB950"
            }
        ]);
    });
});

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...