caolan / caolan/nodeunit

process.exit before console buffer flushed in Windows

Đang mở
#282 1 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
JavaScript
Star
1.9k
Fork
359
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

## Symptoms

If any test fails, not all the console output is shown (console output is truncated).

Problem does not show up in standard Windows `cmd`, but does show up if tests are run from Cygwin or within Sublime Text build system. In Cygwin, if the output is piped to a file instead of being displayed on the console then all the results show in the file, even though they did not show in the console when not piped.
## Environment
- nodeunit 0.9.0,
- node 0.10.17
- Windows 7
## Minimal Example

I have the following test file, `tests.js`:

```
for (var i = 0; i < 30; i++)
console.log('' + i);

exports.dummy = function(test) {
test.fail();
test.done();
}
```

Running from Cygwin, the result is:

```
$ nodeunit tests.js
0
```

(I.e., only the first console.log appears). But if I remove the `test.fail` line then all the output appears.
## Cause

My guess of the cause is given in the title. It appears that under different circumstances, sometimes the node console is _asynchronous_ (perhaps due to the way Windows pipes work, I'm not sure), and doesn't flush the output after every write. When a test fails, [line 130 in nodeunit/nodeunit](https://github.com/caolan/nodeunit/blob/60b7d67250a8005fcca6d71a18697c9bdc6613bd/bin/nodeunit#L130) `process.exit(1);` seems to recognize the error and exit the process, but `process.exit` does not seem to always wait for the console output to be received by the terminal. To confirm this hypothesis, if I remove the `process.exit` line, then the output is displayed correctly.
## Solution

A work-around seems to be to change [lines 128-132](https://github.com/caolan/nodeunit/blob/60b7d67250a8005fcca6d71a18697c9bdc6613bd/bin/nodeunit#L128-132) to the following:

```
testrunner.run(files, options, function(err) {
if (err) {
process.on('exit', function() {
process.exit(1);
});
}
});
```

This seems to produce the correct error code for the process and also show all the output. I don't know if there are any other side effects of not ending the process immediately in the callback function.

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Hướng nghiên cứu

Bắt đầu trong bin/nodeunit, quanh các dòng 128-132, đặc biệt là process.exit(1) ở dòng 130, và tái hiện vấn đề bằng tests.js được cung cấp trên Cygwin. Xác nhận rằng các lần chạy thất bại hiển thị toàn bộ đầu ra của console nhưng vẫn trả về mã thoát 1; workaround hiện có cung cấp hành vi mong đợi để kiểm tra.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
javascript
Lĩnh vực
cli, operating-systems, testing
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
38/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.