Javascript 数组的side-forEach方法中代码的NodeJs测试用例

Javascript 数组的side-forEach方法中代码的NodeJs测试用例,javascript,node.js,mocha.js,sinon,Javascript,Node.js,Mocha.js,Sinon,这里的文件是一个数组,类似于var files=['/tmp/1.pdf','/tmp/2.pdf'] 方法: var createAttachmentsForMail = function (files) { var attachmets = []; files.forEach(function (value) { attachmets.push( { "Content-type": mime.looku

这里的文件是一个数组,类似于var files=['/tmp/1.pdf','/tmp/2.pdf']

方法:

var createAttachmentsForMail = function (files) {
    var attachmets = [];

    files.forEach(function (value) {
        attachmets.push(
            {
                "Content-type": mime.lookup(value),
                "FileName": path.basename(value),
                "content": new   Buffer(fs.readFileSync(value)).toString('base64')
            }
        );
    });

    return attachmets;
};
测试方法:我想测试attachment.push调用了2次,但如何测试?我还想声明返回的附件。

describe("Create attachments", function() {

    it('from pdf path', function() {

        var files = [
            '/tmp/1.pdf',
            '/tmp/2.pdf'
        ];

        sinon.stub(fs, "readFileSync");

        sinon.stub(files);

        mailSender.createAttachmentsForMail(files);

        sinon.assert.calledOnce(files.forEach);

        fs.readFileSync.restore();
        files.forEach.restore();
    });
});

调用
sinon.stub(文件)时插入文件数组的所有方法。这意味着forEach实际上不会被执行,您也不会生成任何文件。
这就是为什么我猜你不能检查文件的数量

第二件事是,不需要测试像“if.push调用了两次”或“if.forEach”这样的东西。因为如果您稍微更改了实现(例如,您开始使用lodash u2; each而不是Array.prototype.forEach),您的测试将停止工作

您应该测试行为,而不是内部实现

var assert=require('assert');
描述(“#createAttachmentsForMail”,()=>{
它('应形成适当的文件名/内容类型等',函数(){
变量文件=[
“/tmp/1.pdf”,
“/tmp/2.pdf”
];
//另外,让我们让readFileSync始终返回模拟数据
sinon.stub(fs,“readFileSync”,()=>“模拟内容”);
var attachments=createAttachmentsForMail(文件);
//测试我们是否收到了2个附件。
断言。相等(附件。长度,2);
对于(附件的var附件){
//检查我们是否收到了正确的内容类型
assert.equal(附件['Content-type'],'application/pdf');
//做其他需要的检查。。。
}
fs.readFileSync.restore();
});

});为什么不检查createAttachmentsForMail的返回值是否是这两个项的数组?@AndersBornholm好的,您可以编写代码来写入createAttachmentsForMail的返回值吗?提前谢谢。