断言具有相同内容的文件

时间:2014-09-11 08:55:42

标签: node.js mocha should.js

我正在使用mocha / supertest / should.js来测试我的Rest Service

GET /files/<hash>将文件作为流返回。

如何在should.js中断言文件内容是否相同?

it('should return file as stream', function (done) {
    var writeStream = fs.createWriteStream('test/fixtures/tmp.json');

    var req = api.get('/files/676dfg1430af3595');
    req.on('end', function(){
       var tmpBuf = fs.readFileSync('test/fixtures/tmp.json');
       var testBuf = fs.readFileSync('test/fixtures/test.json');

       // How to assert with should.js file contents are the same (tmpBuf == testBuf )
       // ...

       done();
    });
});

6 个答案:

答案 0 :(得分:5)

令人惊讶的是,没有人建议Buffer.equals。这似乎是最快最简单的方法,自v0.11以来一直存在。

因此,您的代码将变为tmpBuf.equals(testBuf)

答案 1 :(得分:3)

你有3个解决方案:

<强>第一

比较结果字符串

tmpBuf.toString() === testBuf.toString();

<强>第二

使用循环逐字节读取缓冲区

var index = 0,
    length = tmpBuf.length,
    match = true;

while (index < length) {
    if (tmpBuf[index] === testBuf[index]) {
        index++;
    } else {
        match = false;
        break;
    }
}

match; // true -> contents are the same, false -> otherwise

<强>第三

使用第三方模块,如buffertools和buffertools.compare(缓冲区,缓冲区|字符串)方法。

答案 2 :(得分:3)

should.js中,您可以使用.eql来比较缓冲区的实例:

> var buf1 = new Buffer('abc');
undefined
> var buf2 = new Buffer('abc');
undefined
> var buf3 = new Buffer('dsfg');
undefined
> buf1.should.be.eql(buf1)
...
> buf1.should.be.eql(buf2)
...
> buf1.should.be.eql(buf3)
AssertionError: expected <Buffer 61 62 63> to equal <Buffer 64 73 66 67>
    ...
> 

答案 3 :(得分:2)

使用file-comparenode-temp的解决方案:

it('should return test2.json as a stream', function (done) {
    var writeStream = temp.createWriteStream();
    temp.track();

    var req = api.get('/files/7386afde8992');

    req.on('end', function() {
        comparator.compare(writeStream.path, TEST2_JSON_FILE, function(result, err) {
            if (err) {
                return done(err);
            }

            result.should.true;
            done();
        });
    });

    req.pipe(writeStream);
});

答案 4 :(得分:0)

用于比较大文件,例如断言文件上传时的图像缓冲区或字符串与should.eql的比较需要很长时间。我建议使用 crypto 模块声明缓冲区哈希:

const buf1Hash = crypto.createHash('sha256').update(buf1).digest();
const buf2Hash = crypto.createHash('sha256').update(buf2).digest();
buf1Hash.should.eql(buf2Hash);

更简单的方法是断言缓冲区长度,如下所示:

buf1.length.should.eql(buf2.length)

而不是使用 shouldjs 作为断言模块,你肯定可以使用不同的工具

答案 5 :(得分:0)

我认为您应该在JavaScript中使用non-blocking calls以获得更好的性能,至少可以防止阻塞其他操作:

阻塞是指Node.js进程中其他JavaScript的执行必须等到非JavaScript操作完成后才能执行。发生这种情况的原因是,发生阻止操作时,事件循环无法继续运行JavaScript。

在Node.js中,由于占用大量CPU而不是等待诸如I / O之类的非JavaScript操作而表现不佳的JavaScript通常不称为阻塞。 Node.js标准库中使用libuv的同步方法是最常用的阻塞操作。本机模块也可能具有阻塞方法。

因此,我将使用类似以下代码的方式更改Sync调用。另外,我将使用equals建议比较两个文件的方法Max

const fs = require('fs')

fs.readFile('file1', (err, data1) => {
    if (err) throw err;
    fs.readFile('file2', (err, data2) => {
        if (err) throw err;
        if (data1.equals(data2)) {
            console.log('EQUAL')
        } else {
            console.log('NON EQUAL')
        }

    });
});

尽管只有一个脚本,但结果几乎是相同的