2016-12-02 1 views
0

통합 테스트 중에 로그를 유지하려고합니다. 모든 '항목'이 컴파일되고 얼마나 많은 시간이 걸렸는지 테스트하고 있습니다. 노드 4.3을 사용하고 있습니다.NodeJS fs.appendFile이 mocha의 약속 내에서 작동하지 않습니다.

내가 로그 파일 생성 모든

첫째 :

testCompile() { 
    return this 
     .buildItem() 
     .then(result => { 
      // whatever testing stuff 
     }); 
} 

buildItem() { 
    return this 
     .internalLogicForCompiling() 
     .then(result => { 
      // This is not appending anything 
      fs.appendFile("./log.csv", `${item.name}; ${result.compileTime}`); 

      return result; 
     }); 
} 
:

for (const item of items) {  
    it('compiles', function() { 
     return item.testCompile(); 
    }); 
} 

그리고 item 클래스는 이러한 방법이 있습니다

before(function() { 
    if (!fs.existsSync("./log.csv")) { 
     fs.writeFile("./log.csv", "Name; Time"); 
    } 
}); 

그런 다음 각 it 블록 내에서 내가 이런 짓을 했을까을

지금까지 파일이 생성되었지만 업데이트되지 않았습니다 ... 어떤 단서인지 wron 지?

추신 : 파일이 존재하지 않는다면, fs은 오류를 발생시켜야한다고 가정합니다.

답변

1

코드에서 일반적으로 사용자의 fs 호출이 비동기임을 무시합니다. 약속은 마법이 아닙니다. 비동기이지만 약속을 사용하지 않는 코드를 사용하는 경우, 약속에서 코드를 완료한다고 부를 수있는 것보다 더 많은 작업을 수행해야합니다.

문제를 해결하는 가장 쉬운 방법은 호출하는 대신 fs.writeFileSyncfs.appendFileSync을 사용하는 것입니다. 그렇지 않으면, 당신은 당신의 before과 같이 작성해야합니다 :

before(function(done) { 
    if (!fs.existsSync("./log.csv")) { 
     fs.writeFile("./log.csv", "Name; Time", done); 
    } 
}); 

은 그냥 done 콜백을 추가했습니다.

buildItem() { 
    return this 
     .internalLogicForCompiling() 
     .then(result => { 
      return new Promise((resolve, reject) => { 
       fs.appendFile("./log.csv", `${item.name}; ${result.compileTime}`, (err) => { 
        if (err) { 
         reject(err); 
         return; 
        } 
        resolve(result); 
       }); 
      }); 
     }); 
} 
+0

안녕, 나는 이미 그것을했다'return' : appendFile 그 일을 수행하기 전에 반환 약속이 해결되지 않도록

그리고 buildItem는 다음과 같이 될 수 있습니다. 동기화 메서드가 제대로 작동하는 것 같습니다 :) – josemigallas

관련 문제