链式方法调用上的Sinon断言

问题描述 投票:0回答:1

我正在尝试为在 Node js 中生成 Excel 报告文件的服务器方法编写单元测试。

我正在使用

excel4node
库来生成报告。填写该库中单元格的基本调用链如下:

let workbook = new excel4node.Workbook();
let worksheet = report.addWorksheet("worksheetName");
worksheet.cell(1, 1).string("Content in cell A1").style(styleObject);

在我的测试代码中,我采用了仅创建一个大存根对象来解释所有这些方法链调用的方法。无论如何,这都不是一个完美的方法,但这就是我到目前为止所拥有的(目前可以使用):

        styleStub = sinon.stub().returns({style: sinon.stub()});

        cellStringStub = sinon.stub().returns({style: styleStub});
        cellNumberStub = sinon.stub().returns({style: styleStub});

        cellStub = sinon.stub().returns({
            string: cellStringStub,
            number: cellNumberStub,
            style: styleStub,
        });

        // Stub xl.Workbook.addWorksheet.cell method with our defined stubs so that we can
        // assert any calls
        xlStub = sinon.stub(xl, "Workbook").returns({
            addWorksheet: sinon.stub().returns({
                cell: cellStub,
                column: sinon.stub().returns({
                    setWidth: sinon.stub()
                }),
            }),
            createStyle: sinon.stub().returns({}),
        });

我将存根分配给变量,以便我可以在它们上使用 sinon 间谍函数进行断言。我正在努力解决的是在查看给定参数时对该库的方法链调用进行断言。给定一些测试数据,我确切地知道应该将什么放入给定的单元格中。

例如如果我知道单元格 A5 应包含数字 142,则方法链调用将如下所示:

worksheet.cell(1, 5).number(142).style({someStylingObjectImNotConcernedAbout});

考虑到前面的 cell(1, 5) 调用的参数是 1 和 5,有没有办法断言给 number() 方法调用的参数是 142?

谢谢!

javascript node.js sinon sinon-chai
1个回答
0
投票

我已经点击 chatGPT 4 寻求答案 -

是的,你可以用Sinon来做到这一点。您需要创建一个条件断言,仅当使用特定参数调用前面的

.number()
函数时才断言
.cell()
函数的参数。

这是一个例子:

  1. 您可以从断言

    .cell()
    函数正在被调用开始:

    sinon.assert.called(cellStub);

  2. 然后,检查是否使用特定参数调用它(比方说1和5):

    sinon.assert.calledWith(cellStub, 1, 5);

  3. 现在,仅当使用参数 1 和 5 调用

    .number()
    时,您才可以断言对
    .cell()
    函数的调用。您可以通过检查包的调用历史记录来执行此操作。如果最后一次调用使用 1 和 5,则断言
    number()
    函数参数:

    let callArgs = cellStub.getCall(cellStub.callCount - 1).args;
    if(callArgs[0] === 1 && callArgs[1] === 5) {
        sinon.assert.calledWith(cellNumberStub, 142);
    }
    

这将确保您仅测试该数字的参数

© www.soinside.com 2019 - 2024. All rights reserved.