Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在创建文件之前完成Mocha.js测试时出现问题_Javascript_Unit Testing_Mocha.js_Chai - Fatal编程技术网

Javascript 在创建文件之前完成Mocha.js测试时出现问题

Javascript 在创建文件之前完成Mocha.js测试时出现问题,javascript,unit-testing,mocha.js,chai,Javascript,Unit Testing,Mocha.js,Chai,我正在尝试使用Mocha.js和Chai设置一些单元测试,我正在尝试进行的测试之一是检查在调用外部文件中的类之后是否创建了json文件 const chai = require('chai'); chai.use(require('chai-json')); const DataHandler = require('../handler'); const expect = require('chai').expect; const path = require('path') const ha

我正在尝试使用Mocha.js和Chai设置一些单元测试,我正在尝试进行的测试之一是检查在调用外部文件中的类之后是否创建了json文件

const chai = require('chai');
chai.use(require('chai-json'));
const DataHandler = require('../handler');
const expect = require('chai').expect;
const path = require('path')

const handler = new DataHandler();

describe('#json handling', function(){
    it('should create a testData.json file', function(){
        const json = path.basename('../testData.json');
        expect(json).to.be.a.jsonFile();
    })
})
如果我在第一次测试完成后创建testData.json文件时再次运行这些测试,则测试是成功的。然而,情况不应该是这样,当初始化
newdatahandler
时,甚至应该在运行测试之前创建json文件

这是创建/更新json文件的DataHandler类的第一部分,如下所示

类数据处理程序{
构造函数(){
if(this.shouldUpdate()){this.update()};
}
shouldUpdate(){
if(!fs.existsSync(“testData.json”){return true};
const file=fs.readFileSync(“testData.json”);
const parsed=JSON.parse(文件)
const oldDT=Date.parse(解析为['updated_Date']);
const dateDifference=Date.now()-oldDT;
常数分钟=数学楼层(日期差/60000);
如果(分钟数>2){返回真值};
}
更新(){
请求(“http://someurl.com/data.json,函数(错误、响应、正文){
如果(!error&&response.statusCode==200){
const parsedJSON=JSON.parse(body);
parsedJSON['updated_date']=新日期();
const json=json.stringify(parsedJSON);
writeFileSync(“testData.json”,json);
}
})
}
}

您可以在
update()
方法(
request
是异步函数)中异步创建文件,但测试是同步执行的,不会等待文件创建。你必须等待

举个例子。将init代码移出构造函数并单独调用它

const fs = require("fs").promises;

class DataHandler {
  async init() {
    if (this.shouldUpdate()) {
      await this.update();
    }
  }

  async shouldUpdate() {
    const isExist = await fs.stat("testDate.json");
    if (!isExist) {
      return true;
    }

    const file = await fs.readFile("testData.json");
    const parsed = JSON.parse(file);
    const oldDT = Date.parse(parsed["updated_date"]);

    const dateDifference = Date.now() - oldDT;
    const minutes = Math.floor(dateDifference / 60000);

    if (minutes > 2) {
      return true;
    }
  }

  async update() {
    const response = await request("http://someurl.com/data.json");

    if (response.statusCode == 200) {
      const parsedJSON = JSON.parse(body);
      parsedJSON["updated_date"] = new Date();
      const json = JSON.stringify(parsedJSON);
      await fs.writeFile("testData.json", json);
    }
  }
}

和测试

const handler = new DataHandler();

describe('#json handling', function(){
    it('should create a testData.json file', async function(){
        await handler.init()
        const json = path.basename('../testData.json');
        expect(json).to.be.a.jsonFile();
    })
})

类似的

path.basename()方法返回文件路径的文件名部分。它与是否创建文件无关。它只返回给定路径的文件名部分。在您的例子中,`const json=path.basename('../testData.json');`返回测试数据。json@vipulpatel我知道,这不是我的问题。请说明文件是如何在
DataHandler
中创建的?我想,您在异步执行方面遇到了问题,不必等到创建文件时再等待。@kernel72已添加到原始区域post@hcphoon好奇:如果它返回路径中的文件名,那么为什么
expect(json).to.be.a.jsonFile()会出现这种情况断言有效。不应该像简单的字符串比较
expect(json).to.be.eqial.to(“testData.json”)我该怎么做?例如,您可以使用同步版本的
请求
(例如,),这样将使您的代码完全同步,测试应该开始工作。但是在node.js中使用同步代码不是一个好的做法。如果您想避免不好的做法,您必须重写代码以使用与文件一起工作的函数的异步版本。现在可以了谢谢,您建议如何重写我的代码以使用异步版本?我已经研究过使用这个帖子中提到的承诺,但它对我来说不起作用