From 887f971f892492758ff7bad6e85aa04902675334 Mon Sep 17 00:00:00 2001 From: Kyoz Date: Wed, 25 Jul 2018 22:45:42 +0700 Subject: [PATCH 1/7] Init for vietnamese docs. Include contributing & code-of-conduct --- vi_VN/code-of-conduct.md | 50 +++++++++++++++++++++++++++ vi_VN/contributing.md | 73 ++++++++++++++++++++++++++++++++++++++++ vi_VN/readme.md | 0 3 files changed, 123 insertions(+) create mode 100644 vi_VN/code-of-conduct.md create mode 100644 vi_VN/contributing.md create mode 100644 vi_VN/readme.md diff --git a/vi_VN/code-of-conduct.md b/vi_VN/code-of-conduct.md new file mode 100644 index 00000000..393b57e6 --- /dev/null +++ b/vi_VN/code-of-conduct.md @@ -0,0 +1,50 @@ +# Giao ước quy tắc ứng xử của cộng tác viên + +Các bản dịch: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/code-of-conduct.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/code-of-conduct.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/code-of-conduct.md), [日本語](https://github.com/avajs/ava-docs/blob/master/ja_JP/code-of-conduct.md), [Português](https://github.com/avajs/ava-docs/blob/master/pt_BR/code-of-conduct.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/code-of-conduct.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/code-of-conduct.md) + +## Cam kết của chúng tôi + +Vì lợi ích của việc phát triển một môi trường cởi mở và thân thiện, chúng tôi, những người đóng góp và duy trì dự án xin cam kết rằng tất cả mọi người tham gia vào dự án và cộng đồng của chúng tôi sẽ không bị quấy rối về: tuổi tác, kích thước cơ thể, sự khiếm khuyết, dân tộc, nhận dạng và biểu hiện giới tính, kinh nghiệm làm việc, quốc tịch, ngoại hình, chủng tộc, tôn giáo và xu hướng tình dục. + +## Tiêu chuẩn của chúng tôi + +Ví dụ về hành vi góp phần tạo nên một môi trường tích cực bao gồm: + +* Sử dụng ngôn ngữ bao hàm và thân thiện +* Tôn trọng quan điểm cũng như trải nghiệm của nhau +* Chấp nhận những lời chỉ trích mang tính xây dựng một cách nhẹ nhàng +* Tập trung vào những gì tốt nhất cho cộng đồng +* Thể hiện sự đồng cảm với các thành viên khác trong cộng đồng + +Ví dụ về những hành vi không được chấp nhận của người tham gia bao gồm: + +* Sử dụng ngôn ngữ hoặc hình ảnh khiếm nhã, cũng như sự quan tâm hoặc đề nghị tình dục không mong muốn +* Các bình luận mang tính chọc phá, lăng nhục/ xúc phạm, và những sự tấn công cá nhân hoặc chính trị +* Quấy rối công khai hoặc riêng tư +* Đăng tải thông tin cá nhân của người khác, chẳng hạn như địa chỉ thật hoặc địa chỉ điện tử mà không có sự cho phép rõ ràng +* Các hành vi khác có thể được coi là không phù hợp trong một môi trường chuyên nghiệp + +## Trách nhiệm của chúng tôi + +Những người duy trì dự án có trách nhiệm làm rõ các tiêu chuẩn về những hành vi có thể chấp nhận và được kì vọng sẽ thực hiện các hành động khắc phục thích hợp, công bằng để giải quyết bất kì trường hợp nào của các hành vi không được chấp nhận. + +Những người duy trì dự án có quyền và tránh nhiệm xóa, chỉnh sửa hoặc từ chối các bình luận, commits, code, chỉnh sửa wiki, issues và các đóng góp khác không phù hợp với Quy tắc ứng xử này hoặc cấm tạm thời hoặc vĩnh viễn những người đóng góp có những hành vi được cho là không phù hợp, có tính đe dọa, xúc phạm hoặc phá hoại. + +## Phạm vi + +Quy tắc ứng xử này được áp dụng cả trong phạm vi dự án và phạm vi công cộng, khi một cá nhân đang đại diện cho dự án hoặc cộng đồng của nó. Ví dụ về việc đại diện cho một dự án hoặc cộng đồng bao gồm việc sử dụng địa chỉ email chính thức, được đăng thông qua tài khoản truyền thông xã hội chính thức hoặc đóng vai trò là đại diện được bổ nhiệm tại một sự kiện online hoặc offline. Việc đại diện cho một dự án có thể được những người duy trì dự án xác định và làm rõ ràng thêm. + +## Sự tuân thủ + +Các hành vi lạm dụng, quấy rối hoặc không thể chấp nhận có thể được báo cáo bằng cách liên hệ với nhóm dự án tại sindresorhus@gmail.com. Tất cả các khiếu nại sẽ được xem xét, điều tra và sẽ dẫn đến một phản hồi được coi là cần thiết và phù hợp với hoàn cảnh hiện tại. Nhóm dự án có nghĩa vị duy trì tính bảo mật liên quan đến người báo cáo vụ việc. +Các chi tiết khác về những chính sách thực thi cụ thể có thể được đăng tải riêng. + +Những người duy trì dự án không tuân theo hoặc thực thi bộ quy tắc ứng xử một cách không công bằng có thể đối mặt với hậu quả tạm thời hoặc vĩnh viễn do các thành viên khác của ban lãnh đạo dự án quyết định. + +## Thẩm quyền + +Quy tắc ứng xử này được hiệu chỉnh từ [Contributor Covenant][trang chủ], phiên bản 1.4, +có sẵn tại [http://contributor-covenant.org/version/1/4][phiên bản] + +[trang chủ]: http://contributor-covenant.org +[phiên bản]: http://contributor-covenant.org/version/1/4/ diff --git a/vi_VN/contributing.md b/vi_VN/contributing.md new file mode 100644 index 00000000..a0b43929 --- /dev/null +++ b/vi_VN/contributing.md @@ -0,0 +1,73 @@ +# Đóng góp cho AVA + +✨ Cảm ơn bạn đã đóng góp cho AVA! ✨ + +Xin lưu ý rằng dự án này được phát hành với [Quy tắc ứng xử của cộng tác viên](code-of-conduct.md). Để tham gia vào dự án này, bạn phải đồng ý tuân theo các điều khoản của quy tắc trên. + +Các bản dịch: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/contributing.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/contributing.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/contributing.md), [日本語](https://github.com/avajs/ava-docs/blob/master/ja_JP/contributing.md), [Português](https://github.com/avajs/ava-docs/blob/master/pt_BR/contributing.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/contributing.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/contributing.md) + +## Tôi có thể đóng góp như thế nào? + +### Cải thiện tài liệu + +Là một người sử dụng AVA, bạn chính là ứng cử viên hoàn hảo để giúp chúng tôi cải thiện tài liệu của mình. Chỉnh sửa lỗi chính tả, giải thích tốt hơn, thêm nhiều ví dụ hơn, v.v. Mở các issue cho những thứ có thể cải thiện. [Giúp chúng tôi thông dịch các tài liệu.](https://github.com/avajs/ava-docs). Mọi thứ khác, thậm chí việc cải thiện cho tài liệu này + +Sử dụng [nhãn `docs`](https://github.com/avajs/ava/labels/docs) để tìm các đề xuất cho những gì chúng tôi muốn cho thêm vào tài liệu. + +### Cải thiện các issue + +Một số issue được tạo ra với nhiều thông tin còn thiếu, không thể dựng lại, hoặc không hợp lệ. Hãy giúp chúng có thể dễ dàng giải quyết chúng hơn. Việc xử lý các issue mất rất nhiều thời gian mà chúng tôi có thể thay vì đó tập trung vào việc sửa lỗi và thêm các tính năng mới. + +### Cho phản hồi về các issue + +Chúng tôi luôn mong chờ thêm nhiều ý kiến trên những cuộc thảo luận trong issue tracker. Đây là cơ hội tốt để có thể ảnh hưởng đến định hướng tương lai của AVA. + +[Nhãn `question`](https://github.com/avajs/ava/labels/question) là một nơi tốt để tìm các cuộc thảo luận đang diễn ra. + +### Viết code + +Bạn có thể sử dụng các nhãn issue để tìm kiếm những issue mà bạn có thể giúp đỡ: + +* [`babel` issues](https://github.com/avajs/ava/labels/babel) liên quan đến cơ sở hạ tầng Babel của chúng tôi +* [`blocked` issues](https://github.com/avajs/ava/labels/blocked) cần giúp đỡ để gỡ bỏ những vấn đề đang dậm chân tại chỗ +* [`bug` issues](https://github.com/avajs/ava/labels/bug) là những lỗi chúng tôi muốn sửa +* [`enhancement` issues](https://github.com/avajs/ava/labels/enhancement) là các tính năng chúng tôi đang muốn thêm vào +* [`performance` issues](https://github.com/avajs/ava/labels/performance) theo dõi các ý tưởng về cách cải thiện hiệu suất của AVA + +Các nhãn [`help wanted`](https://github.com/avajs/ava/labels/help%20wanted) và [`good for beginner`](https://github.com/avajs/ava/labels/good%20for%20beginner) đặc biệt hữu ích. + +Bạn có thể tìm thấy một issue được chỉ định, hoặc có nhãn [`assigned`](https://github.com/avajs/ava/labels/assigned). Vui lòng kiểm tra kỹ trước khi bắt đầu giải quyết các issue này bởi vì có thể ai đó khác đã đang thực hiện nó. + +Chúng tôi muốn sửa chữa [`priority` issues](https://github.com/avajs/ava/labels/priority) trước tiên. Chúng tôi cũng muốn thấy tiến độ trên [`low-priority` issues](https://github.com/avajs/ava/labels/low%20priority). [`future` issues](https://github.com/avajs/ava/labels/future) là những thứ chúng tôi muốn đạt được, nhưng không phải trong thời gian gần. Hãy kiểm tra trước khi thực hiện, vì chúng tôi không muốn có thêm gánh nặng trong việc hỗ trợ các tính năng đó. + +Nếu có cập nhật các dependencies, hãy đảm bảo rằng bạn đang dùng npm@5.6.0 và commit tệp `package-lock.json` đã được cập nhật. + +### Tham gia trò chuyện cùng chúng tôi + +Chúng tôi có một [nơi tán gẫu](https://spectrum.chat/ava). Hãy vào đó để do thám, trò chuyện và giúp đỡ những người khác. + +## Thêm một issue + +- Issue tracker là dành cho issues. Sử dụng [nơi tán gẫu](https://spectrum.chat/ava) hoặc [Stack Overflow](https://stackoverflow.com/questions/tagged/ava) để được hỗ trợ. +- Hãy tìm kiếm với issue tracker trước khi mở một issue mới. +- Hãy đảm bảo rằng bạn sử dụng phiên bản mới nhất của AVA. +- Sử dụng tiêu đề và mô tả rõ ràng. +- Thêm càng nhiều thông tin liên quan càng tốt: Các bước để dựng lại vấn đề gặp phải, thông báo lỗi, phiên bản Node.js, hệ điều hành, v.v. +- Bạn càng dành nhiều thời gian của mình để làm rõ issue, chúng tôi sẽ càng có nhiều cơ hội để giải quyết chúng. +- [Báo cáo issue tốt nhất nên là một test thất bại để chứng minh cho issue đó.](https://twitter.com/sindresorhus/status/579306280495357953) + +## Thêm một pull request + +- Những thay đổi không đáng kể tốt nhất nên được thảo luận trong một issue trước, để tránh việc bạn thực hiện việc không cần thiết. +- Đối với những công việc đầy tham vọng, bạn nên cố gắng thực hiện công việc của mình trước cộng đồng càng sớm càng tốt. Mở một pull request ngay sau khi bạn đã thực hiện công việc tối thiểu để chứng minh lý tưởng của bạn. Ở giai đoạn đầu này, đừng lo lắng về việc làm mọi thứ hoàn hảo, hoặc hoàn thành chúng 100%. Thêm tiền tố [WIP] vào tiêu đề và mô tả những gì bạn vẫn cần phải làm. Điều này cho phép những người đánh giá biết rằng không nên xem chi tiết hoặc chỉ ra các cải tiến mà vốn dĩ bạn đã biết mình cần phải thực hiện. +- Những tính năng mới phải đi kèm với test và tài liệu. +- Đừng thêm vào các thay đổi không liên quan. +- Lint và kiểm tra trước khi đăng một pull request bằng cách chạy lệnh `$ npm test`. +- Thực hiện yêu cầu pull request từ [nhánh của chủ đề](https://github.com/dchelimsky/rspec/wiki/Topic-Branches), không phải master. +- Sử dụng tiêu đề và mô tả rõ ràng cho các pull request và commit. +- Viết một mô tả có tính thuyết phục về lý do tại sao chúng tôi nên chấp nhận pull request của bạn. Đó là công việc của bạn để thuyết phục chúng tôi. Trả lời "tại sao" nó cần thiết và cung cấp các trường hợp sử dụng cụ thể. +- Bạn có thể được yêu cầu thực hiện các thay đối với các pull request của mình. Không bao giờ cần phải mở một pull request nào khác. [Chỉ cần cập nhật pull request hiện tại.](https://github.com/RichardLitt/knowledge/blob/master/github/amending-a-commit-guide.md) + +Lưu ý: khi thực hiện việc thay đổi codes, hãy cố nhớ lại câu thần chú của AVA (lấy cắp từ Python) rằng luôn có một các tốt nhất để làm điều gì đó. Ví dụ, một yêu cầu thêm alias vào một phần của API ([như thế này](https://github.com/avajs/ava/pull/663)) sẽ bị từ chối mà không có bất kì lợi ích đáng kể nào khác. + +*Bạn đang tìm cách để có đóng góp đầu tiên của bạn cho một dự án mã nguồn mở? Không cần nhìn đâu xa! AVA có thể là một trong những dự án và cộng đồng được chào đón nhất hiện có. Xem bài blog ["Thực hiện đóng góp đầu tiên của bạn"](https://medium.com/@vadimdemedes/making-your-first-contribution-de6576ddb190) để bắt đầu đúng cách và biến công việc của bạn trở thành một phần của AVA!* diff --git a/vi_VN/readme.md b/vi_VN/readme.md new file mode 100644 index 00000000..e69de29b From dbe6b335ef65b69880798c6c5f37c2caa2df3067 Mon Sep 17 00:00:00 2001 From: Kyoz Date: Thu, 26 Jul 2018 17:51:41 +0700 Subject: [PATCH 2/7] Update vietnamese translations --- vi_VN/code-of-conduct.md | 2 +- vi_VN/contributing.md | 4 +- vi_VN/maintaining.md | 134 ++++ vi_VN/readme.md | 1255 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 1392 insertions(+), 3 deletions(-) create mode 100644 vi_VN/maintaining.md diff --git a/vi_VN/code-of-conduct.md b/vi_VN/code-of-conduct.md index 393b57e6..7f868559 100644 --- a/vi_VN/code-of-conduct.md +++ b/vi_VN/code-of-conduct.md @@ -6,7 +6,7 @@ Các bản dịch: [Español](https://github.com/avajs/ava-docs/blob/master/es_E Vì lợi ích của việc phát triển một môi trường cởi mở và thân thiện, chúng tôi, những người đóng góp và duy trì dự án xin cam kết rằng tất cả mọi người tham gia vào dự án và cộng đồng của chúng tôi sẽ không bị quấy rối về: tuổi tác, kích thước cơ thể, sự khiếm khuyết, dân tộc, nhận dạng và biểu hiện giới tính, kinh nghiệm làm việc, quốc tịch, ngoại hình, chủng tộc, tôn giáo và xu hướng tình dục. -## Tiêu chuẩn của chúng tôi +## Tiêu chuẩn của chúng tôi Ví dụ về hành vi góp phần tạo nên một môi trường tích cực bao gồm: diff --git a/vi_VN/contributing.md b/vi_VN/contributing.md index a0b43929..ffd66e1f 100644 --- a/vi_VN/contributing.md +++ b/vi_VN/contributing.md @@ -29,7 +29,7 @@ Chúng tôi luôn mong chờ thêm nhiều ý kiến trên những cuộc thảo Bạn có thể sử dụng các nhãn issue để tìm kiếm những issue mà bạn có thể giúp đỡ: * [`babel` issues](https://github.com/avajs/ava/labels/babel) liên quan đến cơ sở hạ tầng Babel của chúng tôi -* [`blocked` issues](https://github.com/avajs/ava/labels/blocked) cần giúp đỡ để gỡ bỏ những vấn đề đang dậm chân tại chỗ +* [`blocked` issues](https://github.com/avajs/ava/labels/blocked) cần giúp đỡ để gỡ bỏ những vấn đề đang bị cản trở * [`bug` issues](https://github.com/avajs/ava/labels/bug) là những lỗi chúng tôi muốn sửa * [`enhancement` issues](https://github.com/avajs/ava/labels/enhancement) là các tính năng chúng tôi đang muốn thêm vào * [`performance` issues](https://github.com/avajs/ava/labels/performance) theo dõi các ý tưởng về cách cải thiện hiệu suất của AVA @@ -62,7 +62,7 @@ Chúng tôi có một [nơi tán gẫu](https://spectrum.chat/ava). Hãy vào đ - Đối với những công việc đầy tham vọng, bạn nên cố gắng thực hiện công việc của mình trước cộng đồng càng sớm càng tốt. Mở một pull request ngay sau khi bạn đã thực hiện công việc tối thiểu để chứng minh lý tưởng của bạn. Ở giai đoạn đầu này, đừng lo lắng về việc làm mọi thứ hoàn hảo, hoặc hoàn thành chúng 100%. Thêm tiền tố [WIP] vào tiêu đề và mô tả những gì bạn vẫn cần phải làm. Điều này cho phép những người đánh giá biết rằng không nên xem chi tiết hoặc chỉ ra các cải tiến mà vốn dĩ bạn đã biết mình cần phải thực hiện. - Những tính năng mới phải đi kèm với test và tài liệu. - Đừng thêm vào các thay đổi không liên quan. -- Lint và kiểm tra trước khi đăng một pull request bằng cách chạy lệnh `$ npm test`. +- Kiểm tra lỗi code và chạy testing trước khi đăng một pull request bằng cách chạy lệnh `$ npm test`. - Thực hiện yêu cầu pull request từ [nhánh của chủ đề](https://github.com/dchelimsky/rspec/wiki/Topic-Branches), không phải master. - Sử dụng tiêu đề và mô tả rõ ràng cho các pull request và commit. - Viết một mô tả có tính thuyết phục về lý do tại sao chúng tôi nên chấp nhận pull request của bạn. Đó là công việc của bạn để thuyết phục chúng tôi. Trả lời "tại sao" nó cần thiết và cung cấp các trường hợp sử dụng cụ thể. diff --git a/vi_VN/maintaining.md b/vi_VN/maintaining.md new file mode 100644 index 00000000..bd84c736 --- /dev/null +++ b/vi_VN/maintaining.md @@ -0,0 +1,134 @@ +# Duy trì dự án [![Dependency Status](https://david-dm.org/avajs/ava.svg)](https://david-dm.org/avajs/ava) [![devDependency Status](https://david-dm.org/avajs/ava/dev-status.svg)](https://david-dm.org/avajs/ava#info=devDependencies) + + +## Cách hành xử + +**Hãy tử tế với tất cả mọi người.** +Đọc và tuân thủ [Quy tắc ứng xử](code-of-conduct.md). + + +## Kiểm lỗi + + - `npm test`: Kiểm tra lỗi code và chạy toàn bộ các bộ kiểm lỗi cho toàn bộ các chức năng. + - `npm run test-win`: Chạy các bộ kiểm lỗi trên Windows. + - `tap test/fork.js --bail`: Chạy một bộ kiểm lỗi cụ thể và ngưng ngay khi gặp lỗi (hữu ích khi tìm lỗi). + + +## Quy trình xuất bản + +- Cập nhật dependencies. +- Đảm bảo [Travis CI](https://travis-ci.org/avajs/ava) và [AppVeyor](https://ci.appveyor.com/project/avajs/ava/branch/master) đều màu xanh lá (chạy thành công). +- Cập nhật [nếu cần thiết](docs/support-statement.md) trường `engines` trong `package.json` +- Xuất bản một phiên bản mới, dùng [`np`](https://github.com/sindresorhus/np) với số phiên bản tuân theo [semver](http://semver.org). +- Viết một [ghi chú xuất bản](https://github.com/avajs/ava/releases/new) theo cách trình bày của các ghi chú xuất bản trước đó. + + +## Các pull request + +- Các tính năng mới nên đi kèm với các bộ kiểm tra và tài liệu. +- Đảm bảo đã làm theo [hướng dẫn đóng góp](contributing.md). +- Phải có ít nhất một thành viên trong nhóm đánh dấu `LGTM` cho một pull request trước khi nó được merge. +- Tổng hợp các commit lại khi merge. *[Ví dụ](https://github.com/avajs/ava/commit/0675d3444da6958b54c7e5eada91034e516bc97c)* + + +## Các nhãn issue + +Thêm các nhãn sau để phân loại các issue: + +* `babel`: Sử dụng nhãn này khi issue có liên quan đến cơ sở hạ tầng Babel của chúng tôi +* `blocked`: Sử dụng nhãn này khi issue đang bị cản trở . Vui lòng để lại nhận xét hoặc chỉnh sửa mô tả issue với vấn đề hiện đang làm issue bị cản trở. +* `bug`: Sử dụng nhãn này cho các lỗi của AVA +* `DO NOT MERGE`: Sử dụng nhãn này cho các pull request mang tính nghiên cứu và không nên merge +* `docs`: Sử dụng nhãn này để theo dõi các cải tiến cho tài liệu +* `enhancement`: Sử dụng nhãn này cho các yêu cầu tính năng mới +* `good for beginner`: Sử dụng nhãn này cho các issue hữu ích với những người mới sử dụng +* `help wanted`: Sử dụng nhãn này cho các issue mà chúng tôi thực sự mong được sự giúp đỡ từ những người khác không trong nhóm cốt lõi. +* `performance`: Sử dụng nhãn này cho các issue liên quan đến hiệu suất +* `question`: Sử dụng nhãn này cho các vấn đề đang trong giai đoạn thảo luận + +Xin hãy chú ý các nhãn thể hiện sự ưu tiên: + +* `priority`: Các issue cần giải quyết càng sớm càng tốt +* `low priority`: Các issue mà chúng tôi mong có sự tiến triển +* `future`: Các issue mà chúng tôi sẽ không lên kế hoạch để thực hiện trong thời gian gần. Đây là những đề xuất dài hạn mà chúng tôi không thể chấp nhận PRs + +Sử dụng nhãn `assigned` khi có ai đó đang làm việc trên issue để chúng ta có thể tránh các nỗ lực trùng lặp. + +## Giám sát + +Đầu tiên bạn cần cài đặt [`iron-node`](https://github.com/s-a/iron-node) và / hoặc [`devtool`](https://github.com/Jam3/devtool) toàn cục: + +``` +$ npm install --global iron-node devtool +``` + +Trong thư mục gốc của một dự án sử dụng AVA, thực thi: + +``` +$ iron-node node_modules/ava/profile.js +``` + +Hoặc: + +``` +$ devtool node_modules/ava/profile.js +``` + +Khi cửa sổ Dev Tools đã được tải xong, kích hoạt giám sát Memory hoặc CPU, sau đó nhấn Cmd R để chạy lại các kiểm tra. + +Ngay khi các bài kiểm tra kết thúc, hãy ngừng recording và kiểm tra các kết quả giám sát. Biểu đồ flamegraph có thể được hiển thị bằng cách chọn `Chart` từ trình đơn thả xuống trên tab `Profile` (Các view khác bao gồm `Tree (từ trên xuống)` và `Heavy (từ dưới lên)`). + +Có thể bạn cũng muốn xem qua trang Settings của Dev Tools và kích hoạt một hoặc nhiều tùy chọn trong phần Profiling. + +##### Các nguồn tài nguyên hữu ích + + - [Hướng dẫn debug Node.js với `devtool`](http://mattdesl.svbtle.com/debugging-nodejs-in-chrome-devtools). + - [Video hướng dẫn về việc giám sát CPU và Memory bằng Chrome DevTools](https://www.youtube.com/watch?v=KKwmdTByxLk). + + +## Chấm điểm Benchmark + +Đầu tiên thu thập dữ liệu benchmark của một nhánh/commit: + +``` +$ node bench/run +``` + +Khi bạn đã thu thập được dữ liệu từ 2,3 nhánh/ commit: + +``` +$ node bench/compare +``` + +*Chẳng hạn, bạn có thể thu thập dữ liệu benchmark từ working tree và commit cuối cùng.* + +![](https://cloud.githubusercontent.com/assets/4082216/12700805/bf18f730-c7bf-11e5-8a4f-fec0993c053f.png) + +Bây giờ bạn có thể khởi chạy một tập hợp con của bộ benchmark: + +``` +$ node bench/run.js concurrent/sync.js serial/sync.js -- concurrent/sync.js -- serial/sync.js +``` + +Lưu ý dấu `--`. Lệnh bên trên tương đương với việc chấm điểm benchmark cho tất cả các lệnh dưới đây. + +``` +$ ava concurrent/sync.js serial/sync.js +$ ava concurrent/sync.js +$ ava serial/sync.js +``` + +Ngoài ra nếu bạn đang chấm điểm benchmark một bộ mà có thể thất bại, bạn nên thêm cờ `--should-fail` vào bộ đó. + +``` +$ node bench/run.js concurrent/sync.js -- --should-fail other/failures.js +``` + +Lệnh trên tiến hành chấm điểm benchmark cho 2 lệnh, nhưng dự kiến lệnh thứ 2 sẽ thất bại + + +## Trở thành thành viên cốt lõi + +- Thêm user vào `readme.md` và `package.json`. +- Thên user dưới dạng một cộng tác viên cho tất cả các repos và npm package có liên quan đến AVA. +- Chia sẻ thông tin về tài khoản Twitter và khuyến kích tweet/retweet những thứ có liên quan. diff --git a/vi_VN/readme.md b/vi_VN/readme.md index e69de29b..7e28f557 100644 --- a/vi_VN/readme.md +++ b/vi_VN/readme.md @@ -0,0 +1,1255 @@ +___ +**Lưu ý của người phiên dịch** + +Đây là bản dịch của file [readme.md](https://github.com/avajs/ava/blob/master/readme.md). Đây là [liên kết](https://github.com/avajs/ava/compare/d5dd981d0283303ad6cee62b14a59318d2316c85...master#diff-0730bb7c2e8f9ea2438b52e419dd86c9) để thấy sự khác biệt với nhánh chính của AVA (Nếu bạn nhấp vào liên kết mà không thấy có sự thay đổi đối với tệp `readme.md` thì có nghĩa là bản dịch đã được cập nhật). +___ +# [![AVA](media/header.png)](https://ava.li) + +> Test runner của tương lai + +[![Build Status: Linux](https://travis-ci.org/avajs/ava.svg?branch=master)](https://travis-ci.org/avajs/ava) [![Build status: Windows](https://ci.appveyor.com/api/projects/status/e7v91mu2m5x48ehx/branch/master?svg=true)](https://ci.appveyor.com/project/ava/ava/branch/master) [![Coverage Status](https://coveralls.io/repos/github/avajs/ava/badge.svg?branch=master)](https://coveralls.io/github/avajs/ava?branch=master) [![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/xojs/xo) [![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/ava) + [![Mentioned in Awesome Node.js](https://awesome.re/mentioned-badge.svg)](https://github.com/sindresorhus/awesome-nodejs) + +Mặc dù JavaScript là một ngôn ngữ đơn luồng, nhưng IO trong Node.js có thể thực thi song song do tính chất không đồng bộ của nó. AVA tận dụng lợi thế này để chạy các test của bạn một cách đồng thời, điều này đặc biệt có lợi cho việc thực thi các test IO cồng kềnh. Ngoài ra, các file test được chạy song song như các quy trình riêng biệt, cho bạn hiệu năng tốt hơn và một môi trường độc lập cho mỗi file test. [Chuyển](https://github.com/sindresorhus/pageres/commit/663be15acb3dd2eb0f71b1956ef28c2cd3fdeed0) từ Mocha sang AVA trong dự án Pageres đã giảm thời gian chạy test từ 31 xuống còn 11 giây. Việc có các test chạy đồng thời buộc bạn phải viết từng test nhỏ, chi tiết, có ý nghĩa và không phụ thuộc vào trạng thái toàn cục hoặc trạng thái của các test khác, đó là một điều tuyệt vời! + +![](https://github.com/avajs/ava/blob/master/media/mini-reporter.gif) + +*Read our [contributing guide](contributing.md) if you're looking to contribute (issues/PRs/etc).* + +Follow the [AVA Twitter account](https://twitter.com/ava__js) for updates. + +**This documentation covers the 1.0 beta releases, which use Babel 7. The last release that uses Babel 6 is [`v0.25.0`](https://github.com/avajs/ava/tree/v0.25.0).** + +Translations: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/readme.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/readme.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/readme.md), [日本語](https://github.com/avajs/ava-docs/blob/master/ja_JP/readme.md), [한국어](https://github.com/avajs/ava-docs/blob/master/ko_KR/readme.md), [Português](https://github.com/avajs/ava-docs/blob/master/pt_BR/readme.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/readme.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/readme.md) + + +## Contents + +- [Usage](#usage) +- [CLI Usage](#cli) +- [Debugging](#debugging) +- [Reporters](#reporters) +- [Configuration](#configuration) +- [Documentation](#documentation) +- [API](#api) +- [Assertions](#assertions) +- [Snapshot testing](#snapshot-testing) +- [Tips](#tips) +- [FAQ](#faq) +- [Recipes](#recipes) +- [Support](#support) +- [Related](#related) +- [Links](#links) +- [Team](#team) + + +## Why AVA? + +- Minimal and fast +- Simple test syntax +- Runs tests concurrently +- Enforces writing atomic tests +- No implicit globals +- Includes TypeScript & Flow type definitions +- [Magic assert](#magic-assert) +- [Isolated environment for each test file](#process-isolation) +- [Write your tests using the latest JavaScript syntax](#latest-javascript-support) +- [Promise support](#promise-support) +- [Async function support](#async-function-support) +- [Observable support](#observable-support) +- [Enhanced assertion messages](#enhanced-assertion-messages) +- [Automatic parallel test runs in CI](#parallel-runs-in-ci) +- [TAP reporter](#tap-reporter) +- [Automatic migration from other test runners](https://github.com/avajs/ava-codemods#migrating-to-ava) + + +## Test syntax + +```js +import test from 'ava'; + +test('arrays are equal', t => { + t.deepEqual([1, 2], [1, 2]); +}); +``` + +## Usage + +### Add AVA to your project + +To install and set up AVA, run: + +```console +$ npx create-ava --next +``` + +Your `package.json` will then look like this: + +```json +{ + "name": "awesome-package", + "scripts": { + "test": "ava" + }, + "devDependencies": { + "ava": "1.0.0-beta.4" + } +} +``` + +Initialization will work with npm and Yarn, but running `npx` requires [`npm@5.2.0`](https://github.com/npm/npm/releases/tag/v5.2.0) or greater to be installed. Otherwise, you'll have to manually install `ava` and configure the `test` script in your `package.json` as per above: + +```console +$ npm install --save-dev --save-exact ava@next +``` + +Or if you prefer using Yarn: + +```console +$ yarn add ava@next --dev --exact +``` + +### Create your test file + +Create a file named `test.js` in the project root directory: + +```js +import test from 'ava'; + +test('foo', t => { + t.pass(); +}); + +test('bar', async t => { + const bar = Promise.resolve('bar'); + + t.is(await bar, 'bar'); +}); +``` + +### Run it + +```console +$ npm test +``` + +### Watch it + +```console +$ npm test -- --watch +``` + +AVA comes with an intelligent watch mode. [Learn more in its recipe](docs/recipes/watch-mode.md). + +### Supported Node.js versions + +AVA supports the latest release of any major version that [is supported by Node.js itself](https://github.com/nodejs/Release#release-schedule). Read more in our [support statement](docs/support-statement.md). + +## CLI + +```console +$ ava --help + + Usage + ava [ ...] + + Options + --watch, -w Re-run tests when tests and source files change + --match, -m Only run tests with matching title (Can be repeated) + --update-snapshots, -u Update snapshots + --fail-fast Stop after first test failure + --timeout, -T Set global timeout + --serial, -s Run tests serially + --concurrency, -c Max number of test files running at the same time (Default: CPU cores) + --verbose, -v Enable verbose output + --tap, -t Generate TAP output + --color Force color output + --no-color Disable color output + + Examples + ava + ava test.js test2.js + ava test-*.js + ava test + + Default patterns when no arguments: + test.js test-*.js test/**/*.js **/__tests__/**/*.js **/*.test.js +``` + +*Note that the CLI will use your local install of AVA when available, even when run globally.* + +Directories are recursed, with all `*.js` files being treated as test files. Directories named `fixtures`, `helpers` and `node_modules` are *always* ignored. So are files starting with `_` which allows you to place helpers in the same directory as your test files. + +When using `npm test`, you can pass positional arguments directly `npm test test2.js`, but flags needs to be passed like `npm test -- --verbose`. + + +## Debugging + +AVA runs tests in child processes, so to debug tests, you need to do this workaround: + +```console +$ node --inspect node_modules/ava/profile.js some/test/file.js +``` + +### Debugger-specific tips + +- [Chrome DevTools](docs/recipes/debugging-with-chrome-devtools.md) +- [WebStorm](docs/recipes/debugging-with-webstorm.md) +- [Visual Studio Code](docs/recipes/debugging-with-vscode.md) + + +## Reporters + +### Mini-reporter + +The mini-reporter is the default reporter. + + + +### Verbose reporter + +Use the `--verbose` flag to enable the verbose reporter. This is always used in CI environments unless the [TAP reporter](#tap-reporter) is enabled. + + + +### TAP reporter + +AVA supports the TAP format and thus is compatible with [any TAP reporter](https://github.com/sindresorhus/awesome-tap#reporters). Use the `--tap` flag to enable TAP output. + +```console +$ ava --tap | tap-nyan +``` + + + +Please note that the TAP reporter is unavailable when using [watch mode](#watch-it). + +### Magic assert + +AVA adds code excerpts and clean diffs for actual and expected values. If values in the assertion are objects or arrays, only a diff is displayed, to remove the noise and focus on the problem. The diff is syntax-highlighted too! If you are comparing strings, both single and multi line, AVA displays a different kind of output, highlighting the added or missing characters. + +![](media/magic-assert-combined.png) + +### Clean stack traces + +AVA automatically removes unrelated lines in stack traces, allowing you to find the source of an error much faster, as seen above. + + +## Configuration + +All of the CLI options can be configured in the `ava` section of either your `package.json` or an `ava.config.js` file. This allows you to modify the default behavior of the `ava` command, so you don't have to repeatedly type the same options on the command prompt. + +To ignore a file or directory, prefix the pattern with an `!` (exclamation mark). + +```json +{ + "ava": { + "files": [ + "my-test-directory/**/*.js", + "!my-test-directory/exclude-this-directory/**/*.js", + "!**/exclude-this-file.js" + ], + "sources": [ + "**/*.{js,jsx}", + "!dist/**/*" + ], + "match": [ + "*oo", + "!foo" + ], + "cache": true, + "concurrency": 5, + "failFast": true, + "failWithoutAssertions": false, + "tap": true, + "compileEnhancements": false, + "require": [ + "@babel/register" + ], + "babel": { + "extensions": ["jsx"], + "testOptions": { + "babelrc": false + } + } + } +} +``` + +Arguments passed to the CLI will always take precedence over the configuration in `package.json`. + +### Options + +- `files`: file & directory paths and glob patterns that select which files AVA will run tests from. Files with an underscore prefix are ignored. All matched files in selected directories are run. By default only selects files with `js` extensions, even if the glob pattern matches other files. Specify `extensions` and `babel.extensions` to allow other file extensions +- `source`: files that, when changed, cause tests to be re-run in watch mode. See the [watch mode recipe for details](https://github.com/avajs/ava/blob/master/docs/recipes/watch-mode.md#source-files-and-test-files) +- `match`: not typically useful in the `package.json` configuration, but equivalent to [specifying `--match` on the CLI](#running-tests-with-matching-titles) +- `cache`: cache compiled test and helper files under `node_modules/.cache/ava`. If `false`, files are cached in a temporary directory instead +- `failFast`: stop running further tests once a test fails +- `failWithoutAssertions`: if `false`, does not fail a test if it doesn't run [assertions](#assertions) +- `tap`: if `true`, enables the [TAP reporter](#tap-reporter) +- `snapshotDir`: specifies a fixed location for storing snapshot files. Use this if your snapshots are ending up in the wrong location +- `compileEnhancements`: if `false`, disables [power-assert](https://github.com/power-assert-js/power-assert) — which otherwise helps provide more descriptive error messages — and detection of improper use of the `t.throws()` assertion +- `extensions`: extensions of test files that are not precompiled using AVA's Babel presets. Note that files are still compiled to enable power-assert and other features, so you may also need to set `compileEnhancements` to `false` if your files are not valid JavaScript. Setting this overrides the default `"js"` value, so make sure to include that extension in the list, as long as it's not included in `babel.extensions` +- `require`: extra modules to require before tests are run. Modules are required in the [worker processes](#process-isolation) +- `babel`: test file specific Babel options. See our [Babel recipe] for more details +- `babel.extensions`: extensions of test files that will be precompiled using AVA's Babel presets. Setting this overrides the default `"js"` value, so make sure to include that extension in the list + +Note that providing files on the CLI overrides the `files` option. If you've configured a glob pattern, for instance `test/**/*.test.js`, you may want to repeat it when using the CLI: `ava 'test/integration/*.test.js'`. + +### Using `ava.config.js` + +To use an `ava.config.js` file: + + 1. It must be in the same directory as your `package.json` + 2. Your `package.json` must not contain an `ava` property (or, if it does, it must be an empty object) + +The config file must have a default export, using ES modules. It can either be a plain object or a factory function which returns a plain object: + +```js +export default { + require: ['esm'] +}; +``` + +```js +export default function factory() { + return { + require: ['esm'] + }; +}; +``` + +The factory function is called with an object containing a `projectDir` property, which you could use to change the returned configuration: + +```js +export default ({projectDir}) => { + if (projectDir === '/Users/username/projects/my-project') { + return { + // Config A + }; + } + + return { + // Config B + }; +}; +``` + +Note that the final configuration must not be a promise. + +## Documentation + +Tests are run concurrently. You can specify synchronous and asynchronous tests. Tests are considered synchronous unless you return a promise or [observable](https://github.com/zenparsing/zen-observable). + +We *highly* recommend the use of [async functions](#async-function-support). They make asynchronous code concise and readable, and they implicitly return a promise so you don't have to. + +If you're unable to use promises or observables, you may enable "callback mode" by defining your test with `test.cb([title], fn)`. Tests declared this way **must** be manually ended with `t.end()`. This mode is mainly intended for testing callback-style APIs. However, we would strongly recommend [promisifying](https://github.com/sindresorhus/pify) callback-style APIs instead of using "callback mode", as this results in more correct and readable tests. + +You must define all tests synchronously. They can't be defined inside `setTimeout`, `setImmediate`, etc. + +AVA tries to run test files with their current working directory set to the directory that contains your `package.json` file. + +### Creating tests + +To create a test you call the `test` function you imported from AVA. Provide the required title and implementation function. Titles must be unique within each test file. The function will be called when your test is run. It's passed an [execution object](#t) as its first argument. + +**Note:** In order for the [enhanced assertion messages](#enhanced-assertion-messages) to behave correctly, the first argument **must** be named `t`. + +```js +import test from 'ava'; + +test('my passing test', t => { + t.pass(); +}); +``` + +### Assertion planning + +Assertion plans ensure tests only pass when a specific number of assertions have been executed. They'll help you catch cases where tests exit too early. They'll also cause tests to fail if too many assertions are executed, which can be useful if you have assertions inside callbacks or loops. + +If you do not specify an assertion plan, your test will still fail if no assertions are executed. Set the `failWithoutAssertions` option to `false` in AVA's [`package.json` configuration](#configuration) to disable this behavior. + +Note that, unlike [`tap`](https://www.npmjs.com/package/tap) and [`tape`](https://www.npmjs.com/package/tape), AVA does *not* automatically end a test when the planned assertion count is reached. + +These examples will result in a passed test: + +```js +test('resolves with 3', t => { + t.plan(1); + + return Promise.resolve(3).then(n => { + t.is(n, 3); + }); +}); + +test.cb('invokes callback', t => { + t.plan(1); + + someAsyncFunction(() => { + t.pass(); + t.end(); + }); +}); +``` + +These won't: + +```js +test('loops twice', t => { + t.plan(2); + + for (let i = 0; i < 3; i++) { + t.true(i < 3); + } +}); // Fails, 3 assertions are executed which is too many + +test('invokes callback synchronously', t => { + t.plan(1); + + someAsyncFunction(() => { + t.pass(); + }); +}); // Fails, the test ends synchronously before the assertion is executed +``` + +### Running tests serially + +Tests are run concurrently by default, however, sometimes you have to write tests that cannot run concurrently. In these rare cases you can use the `.serial` modifier. It will force those tests to run serially *before* the concurrent ones. + +```js +test.serial('passes serially', t => { + t.pass(); +}); +``` + +Note that this only applies to tests within a particular test file. AVA will still run multiple tests files at the same time unless you pass the [`--serial` CLI flag](#cli). + +You can use the `.serial` modifier with all tests, hooks and even `.todo()`, but it's only available on the `test` function. + +### Running specific tests + +During development it can be helpful to only run a few specific tests. This can be accomplished using the `.only` modifier: + +```js +test('will not be run', t => { + t.fail(); +}); + +test.only('will be run', t => { + t.pass(); +}); +``` + +You can use the `.only` modifier with all tests. It cannot be used with hooks or `.todo()`. + +*Note:* The `.only` modifier applies to the test file it's defined in, so if you run multiple test files, tests in other files will still run. If you want to only run the `test.only` test, provide just that test file to AVA. + +### Running tests with matching titles + +The `--match` flag allows you to run just the tests that have a matching title. This is achieved with simple wildcard patterns. Patterns are case insensitive. See [`matcher`](https://github.com/sindresorhus/matcher) for more details. + +Match titles ending with `foo`: + +```console +$ ava --match='*foo' +``` + +Match titles starting with `foo`: + +```console +$ ava --match='foo*' +``` + +Match titles containing `foo`: + +```console +$ ava --match='*foo*' +``` + +Match titles that are *exactly* `foo` (albeit case insensitively): + +```console +$ ava --match='foo' +``` + +Match titles not containing `foo`: + +```console +$ ava --match='!*foo*' +``` + +Match titles starting with `foo` and ending with `bar`: + +```console +$ ava --match='foo*bar' +``` + +Match titles starting with `foo` or ending with `bar`: + +```console +$ ava --match='foo*' --match='*bar' +``` + +Note that a match pattern takes precedence over the `.only` modifier. Only tests with an explicit title are matched. Tests without titles or whose title is derived from the implementation function will be skipped when `--match` is used. + +Here's what happens when you run AVA with a match pattern of `*oo*` and the following tests: + +```js +test('foo will run', t => { + t.pass(); +}); + +test('moo will also run', t => { + t.pass(); +}); + +test.only('boo will run but not exclusively', t => { + t.pass(); +}); + +// Won't run, no title +test(function (t) { + t.fail(); +}); + +// Won't run, no explicit title +test(function foo(t) { + t.fail(); +}); +``` + +### Skipping tests + +Sometimes failing tests can be hard to fix. You can tell AVA to skip these tests using the `.skip` modifier. They'll still be shown in the output (as having been skipped) but are never run. + +```js +test.skip('will not be run', t => { + t.fail(); +}); +``` + +You must specify the implementation function. You can use the `.skip` modifier with all tests and hooks, but not with `.todo()`. You can not apply further modifiers to `.skip`. + +### Test placeholders ("todo") + +You can use the `.todo` modifier when you're planning to write a test. Like skipped tests these placeholders are shown in the output. They only require a title; you cannot specify the implementation function. + +```js +test.todo('will think about writing this later'); +``` + +You can signal that you need to write a serial test: + +```js +test.serial.todo('will think about writing this later'); +``` + +### Failing tests + +You can use the `.failing` modifier to document issues with your code that need to be fixed. Failing tests are run just like normal ones, but they are expected to fail, and will not break your build when they do. If a test marked as failing actually passes, it will be reported as an error and fail the build with a helpful message instructing you to remove the `.failing` modifier. + +This allows you to merge `.failing` tests before a fix is implemented without breaking CI. This is a great way to recognize good bug report PR's with a commit credit, even if the reporter is unable to actually fix the problem. + +```js +// See: github.com/user/repo/issues/1234 +test.failing('demonstrate some bug', t => { + t.fail(); // Test will count as passed +}); +``` + +### Before & after hooks + +AVA lets you register hooks that are run before and after your tests. This allows you to run setup and/or teardown code. + +`test.before()` registers a hook to be run before the first test in your test file. Similarly `test.after()` registers a hook to be run after the last test. Use `test.after.always()` to register a hook that will **always** run once your tests and other hooks complete. `.always()` hooks run regardless of whether there were earlier failures, so they are ideal for cleanup tasks. Note however that uncaught exceptions, unhandled rejections or timeouts will crash your tests, possibly preventing `.always()` hooks from running. + +`test.beforeEach()` registers a hook to be run before each test in your test file. Similarly `test.afterEach()` a hook to be run after each test. Use `test.afterEach.always()` to register an after hook that is called even if other test hooks, or the test itself, fail. + +If a test is skipped with the `.skip` modifier, the respective `.beforeEach()`, `.afterEach()` and `.afterEach.always()` hooks are not run. Likewise, if all tests in a test file are skipped `.before()`, `.after()` and `.after.always()` hooks for the file are not run. + +Like `test()` these methods take an optional title and an implementation function. The title is shown if your hook fails to execute. The implementation is called with an [execution object](#t). You can use assertions in your hooks. You can also pass a [macro function](#test-macros) and additional arguments. + +`.before()` hooks execute before `.beforeEach()` hooks. `.afterEach()` hooks execute before `.after()` hooks. Within their category the hooks execute in the order they were defined. By default hooks execute concurrently, but you can use `test.serial` to ensure only that single hook is run at a time. Unlike with tests, serial hooks are *not* run before other hooks: + +```js +test.before(t => { + // This runs before all tests +}); + +test.before(t => { + // This runs concurrently with the above +}); + +test.serial.before(t => { + // This runs after the above +}); + +test.serial.before(t => { + // This too runs after the above, and before tests +}); + +test.after('cleanup', t => { + // This runs after all tests +}); + +test.after.always('guaranteed cleanup', t => { + // This will always run, regardless of earlier failures +}); + +test.beforeEach(t => { + // This runs before each test +}); + +test.afterEach(t => { + // This runs after each test +}); + +test.afterEach.always(t => { + // This runs after each test and other test hooks, even if they failed +}); + +test('title', t => { + // Regular test +}); +``` + +Hooks can be synchronous or asynchronous, just like tests. To make a hook asynchronous return a promise or observable, use an async function, or enable callback mode via `test.before.cb()`, `test.beforeEach.cb()` etc. + +```js +test.before(async t => { + await promiseFn(); +}); + +test.after(t => { + return new Promise(/* ... */); +}); + +test.beforeEach.cb(t => { + setTimeout(t.end); +}); + +test.afterEach.cb(t => { + setTimeout(t.end); +}); +``` + +Keep in mind that the `.beforeEach()` and `.afterEach()` hooks run just before and after a test is run, and that by default tests run concurrently. This means each multiple `.beforeEach()` hooks may run concurrently. Using `test.serial.beforeEach()` does not change this. If you need to set up global state for each test (like spying on `console.log` [for example](https://github.com/avajs/ava/issues/560)), you'll need to make sure the tests themselves are [run serially](#running-tests-serially). + +Remember that AVA runs each test file in its own process. You may not have to clean up global state in a `.after()`-hook since that's only called right before the process exits. + +#### Test context + +Hooks can share context with the test: + +```js +test.beforeEach(t => { + t.context.data = generateUniqueData(); +}); + +test('context data is foo', t => { + t.is(t.context.data + 'bar', 'foobar'); +}); +``` + +Context created in `.before()` hooks is [cloned](https://www.npmjs.com/package/lodash.clone) before it is passed to `.beforeEach()` hooks and / or tests. The `.after()` and `.after.always()` hooks receive the original context value. + +For `.beforeEach()`, `.afterEach()` and `.afterEach.always()` hooks the context is *not* shared between different tests, allowing you to set up data such that it will not leak to other tests. + +By default `t.context` is an object but you can reassign it: + +```js +test.before(t => { + t.context = 'unicorn'; +}); + +test('context is unicorn', t => { + t.is(t.context, 'unicorn'); +}); +``` + +### Test macros + +Additional arguments passed to the test declaration will be passed to the test implementation. This is useful for creating reusable test macros. + +```js +function macro(t, input, expected) { + t.is(eval(input), expected); +} + +test('2 + 2 = 4', macro, '2 + 2', 4); +test('2 * 3 = 6', macro, '2 * 3', 6); +``` + +You can build the test title programmatically by attaching a `title` function to the macro: + +```js +function macro(t, input, expected) { + t.is(eval(input), expected); +} + +macro.title = (providedTitle, input, expected) => `${providedTitle} ${input} = ${expected}`.trim(); + +test(macro, '2 + 2', 4); +test(macro, '2 * 3', 6); +test('providedTitle', macro, '3 * 3', 9); +``` + +The `providedTitle` argument defaults to an empty string if the user does not supply a string title. This allows for easy concatenation without having to worry about `null` / `undefined`. It is worth remembering that the empty string is considered a falsy value, so you can still use `if(providedTitle) {...}`. + +You can also pass arrays of macro functions: + +```js +const safeEval = require('safe-eval'); + +function evalMacro(t, input, expected) { + t.is(eval(input), expected); +} + +function safeEvalMacro(t, input, expected) { + t.is(safeEval(input), expected); +} + +test([evalMacro, safeEvalMacro], '2 + 2', 4); +test([evalMacro, safeEvalMacro], '2 * 3', 6); +``` + +We encourage you to use macros instead of building your own test generators ([here is an example](https://github.com/avajs/ava-codemods/blob/47073b5b58aa6f3fb24f98757be5d3f56218d160/test/ok-to-truthy.js#L7-L9) of code that should be replaced with a macro). Macros are designed to perform static analysis of your code, which can lead to better performance, IDE integration, and linter rules. + +### Custom assertions + +You can use any assertion library instead of or in addition to the built-in one, provided it throws exceptions when the assertion fails. + +This won't give you as nice an experience as you'd get with the [built-in assertions](#assertions) though, and you won't be able to use the [assertion planning](#assertion-planning) ([see #25](https://github.com/avajs/ava/issues/25)). + +You'll have to configure AVA to not fail tests if no assertions are executed, because AVA can't tell if custom assertions pass. Set the `failWithoutAssertions` option to `false` in AVA's [`package.json` configuration](#configuration). + +```js +import assert from 'assert'; + +test('custom assertion', t => { + assert(true); +}); +``` + +### Latest JavaScript support + +AVA uses [Babel 7](https://babeljs.io) so you can use the latest JavaScript syntax in your tests. There is no extra setup required. You don't need to be using Babel in your own project for this to work either. + +We aim support all [finished syntax proposals](https://github.com/tc39/proposals/blob/master/finished-proposals.md), as well as all syntax from ratified JavaScript versions (e.g. ES2017). See our [`@ava/stage-4`](https://github.com/avajs/babel-preset-stage-4) preset for the currently supported proposals. + +Please note that we do not add or modify built-ins. For example, if you use [`Object.entries()`](https://github.com/tc39/proposal-object-values-entries) in your tests, they will crash in Node.js 6 which does not implement this method. + +You can disable this syntax support, or otherwise customize AVA's Babel pipeline. See our [Babel recipe] for more details. + +### TypeScript support + +AVA includes typings for TypeScript. You have to set up transpilation yourself. When you set `module` to `commonjs` in your `tsconfig.json` file, TypeScript will automatically find the type definitions for AVA. You should set `target` to `es2015` to use promises and async functions. + +See AVA's [TypeScript recipe](docs/recipes/typescript.md) for a more detailed explanation. + +### Transpiling imported modules + +AVA currently only transpiles the tests you ask it to run, as well as test helpers (files starting with `_` or in `helpers` directory) inside the test directory. *It will not transpile modules you `import` from outside of the test.* This may be unexpected but there are workarounds. + +If you use Babel you can use its [require hook](https://babeljs.io/docs/usage/require/) to transpile imported modules on-the-fly. To add it, [configure it in your `package.json`](#configuration). + +You can also transpile your modules in a separate process and refer to the transpiled files rather than the sources from your tests. Example [here](docs/recipes/precompiling-with-webpack.md). + +### Promise support + +If you return a promise in the test you don't need to explicitly end the test as it will end when the promise resolves. + +```js +test('resolves with unicorn', t => { + return somePromise().then(result => { + t.is(result, 'unicorn'); + }); +}); +``` + +### Async function support + +AVA comes with built-in support for [async functions](https://tc39.github.io/ecmascript-asyncawait/) *(async/await)*. + +```js +test(async function (t) { + const value = await promiseFn(); + t.true(value); +}); + +// Async arrow function +test('promises the truth', async t => { + const value = await promiseFn(); + t.true(value); +}); +``` + +### Observable support + +AVA comes with built-in support for [observables](https://github.com/zenparsing/es-observable). If you return an observable from a test, AVA will automatically consume it to completion before ending the test. + +*You do not need to use "callback mode" or call `t.end()`.* + +```js +test('handles observables', t => { + t.plan(3); + return Observable.of(1, 2, 3, 4, 5, 6) + .filter(n => { + // Only even numbers + return n % 2 === 0; + }) + .map(() => t.pass()); +}); +``` + +### Callback support + +AVA supports using `t.end` as the final callback when using node-style error-first callback APIs. AVA will consider any truthy value passed as the first argument to `t.end` to be an error. Note that `t.end` requires "callback mode", which can be enabled by using the `test.cb` chain. + +```js +test.cb('data.txt can be read', t => { + // `t.end` automatically checks for error as first argument + fs.readFile('data.txt', t.end); +}); +``` + +### Global timeout + +A global timeout can be set via the `--timeout` option. Timeout in AVA behaves differently than in other test frameworks. AVA resets a timer after each test, forcing tests to quit if no new test results were received within the specified timeout. This can be used to handle stalled tests. + +You can set timeouts in a human-readable way: + +```console +$ ava --timeout=10s # 10 seconds +$ ava --timeout=2m # 2 minutes +$ ava --timeout=100 # 100 milliseconds +``` + +### Parallel runs in CI + +AVA automatically detects whether your CI environment supports parallel builds. Each build will run a subset of all test files, while still making sure all tests get executed. See the [`ci-parallel-vars`](https://www.npmjs.com/package/ci-parallel-vars) package for a list of supported CI environments. + +## API + +### `test([title], implementation)` +### `test.serial([title], implementation)` +### `test.cb([title], implementation)` +### `test.only([title], implementation)` +### `test.skip([title], implementation)` +### `test.todo(title)` +### `test.failing([title], implementation)` +### `test.before([title], implementation)` +### `test.after([title], implementation)` +### `test.beforeEach([title], implementation)` +### `test.afterEach([title], implementation)` + +#### `title` + +Type: `string` + +Test title. + +#### `implementation(t)` + +Type: `function` + +Should contain the actual test. + +##### `t` + +Type: `object` + +The execution object of a particular test. Each test implementation receives a different object. Contains the [assertions](#assertions) as well as `.plan(count)` and `.end()` methods. `t.context` can contain shared state from hooks. `t.title` returns the test's title. + +###### `t.plan(count)` + +Plan how many assertion there are in the test. The test will fail if the actual assertion count doesn't match the number of planned assertions. See [assertion planning](#assertion-planning). + +###### `t.end()` + +End the test. Only works with `test.cb()`. + +###### `t.log(...values)` + +Log values contextually alongside the test result instead of immediately printing them to `stdout`. Behaves somewhat like `console.log`, but without support for placeholder tokens. + +## Assertions + +Assertions are mixed into the [execution object](#t) provided to each test implementation: + +```js +test('unicorns are truthy', t => { + t.truthy('unicorn'); // Assertion +}); +``` + +Assertions are bound to their test so you can assign them to a variable or pass them around: + +```js +test('unicorns are truthy', t => { + const truthy = t.truthy; + truthy('unicorn'); +}); +``` + +Assertions can be skipped by adding `.skip()`: + +```js +test('unicorns are truthy', t => { + t.truthy.skip('unicorn'); +}); +``` + +If multiple assertion failures are encountered within a single test, AVA will only display the *first* one. + +### `.pass([message])` + +Passing assertion. + +### `.fail([message])` + +Failing assertion. + +### `.truthy(value, [message])` + +Assert that `value` is truthy. + +### `.falsy(value, [message])` + +Assert that `value` is falsy. + +### `.true(value, [message])` + +Assert that `value` is `true`. + +### `.false(value, [message])` + +Assert that `value` is `false`. + +### `.is(value, expected, [message])` + +Assert that `value` is the same as `expected`. This is based on [`Object.is()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). + +### `.not(value, expected, [message])` + +Assert that `value` is not the same as `expected`. This is based on [`Object.is()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). + +### `.deepEqual(value, expected, [message])` + +Assert that `value` is deeply equal to `expected`. See [Concordance](https://github.com/concordancejs/concordance) for details. Works with [React elements and `react-test-renderer`](https://github.com/concordancejs/react). + +### `.notDeepEqual(value, expected, [message])` + +Assert that `value` is not deeply equal to `expected`. The inverse of `.deepEqual()`. + +### `.throws(thrower, [expected, [message]])` + +Assert that an error is thrown. `thrower` can be a function which should throw, or return a promise that should reject. Alternatively a promise can be passed directly. + +The thrown value *must* be an error. It is returned so you can run more assertions against it. + +`expected` can be a constructor, in which case the thrown error must be an instance of the constructor. It can be a string, which is compared against the thrown error's message, or a regular expression which is matched against this message. You can also specify a matcher object with one or more of the following properties: + +* `instanceOf`: a constructor, the thrown error must be an instance of +* `is`: the thrown error must be strictly equal to `expected.is` +* `message`: either a string, which is compared against the thrown error's message, or a regular expression, which is matched against this message +* `name`: the expected `.name` value of the thrown error +* `code`: the expected `.code` value of the thrown error + +`expected` does not need to be specified. If you don't need it but do want to set an assertion message you have to specify `null`. + +Example: + +```js +const fn = () => { + throw new TypeError('🦄'); +}; + +test('throws', t => { + const error = t.throws(() => { + fn(); + }, TypeError); + + t.is(error.message, '🦄'); +}); +``` + +```js +const promise = Promise.reject(new TypeError('🦄')); + +test('rejects', async t => { + const error = await t.throws(promise); + t.is(error.message, '🦄'); +}); +``` + +When testing a promise you must wait for the assertion to complete: + +```js +test('rejects', async t => { + await t.throws(promise); +}); +``` + +When testing an asynchronous function you must also wait for the assertion to complete: + +```js +test('throws', async t => { + await t.throws(async () => { + throw new TypeError('🦄'); + }, {instanceOf: TypeError, message: '🦄'}); +}); +``` + +### `.notThrows(nonThrower, [message])` + +Assert that no error is thrown. `thrower` can be a function which shouldn't throw, or return a promise that should resolve. Alternatively a promise can be passed directly. + +Like the `.throws()` assertion, when testing a promise you must wait for the assertion to complete: + +```js +test('resolves', async t => { + await t.notThrows(promise); +}); +``` + +### `.regex(contents, regex, [message])` + +Assert that `contents` matches `regex`. + +### `.notRegex(contents, regex, [message])` + +Assert that `contents` does not match `regex`. + +### `.snapshot(expected, [message])` +### `.snapshot(expected, [options], [message])` + +Compares the `expected` value with a previously recorded snapshot. Snapshots are stored for each test, so ensure you give your tests unique titles. Alternatively pass an `options` object to select a specific snapshot, for instance `{id: 'my snapshot'}`. + +Snapshot assertions cannot be skipped when snapshots are being updated. + +## Snapshot testing + +AVA supports snapshot testing, [as introduced by Jest](https://facebook.github.io/jest/docs/snapshot-testing.html), through its [Assertions](#assertions) interface. You can snapshot any value as well as React elements: + +```js +// Your component +const HelloWorld = () =>

Hello World...!

; + +export default HelloWorld; +``` + +```js +// Your test +import test from 'ava'; +import render from 'react-test-renderer'; +import HelloWorld from '.'; + +test('HelloWorld component', t => { + const tree = render.create().toJSON(); + t.snapshot(tree); +}); +``` + +[Try it out in this example project.](https://github.com/avajs/ava-snapshot-example) + +Snapshots are stored alongside your test files. If your tests are in a `test` or `tests` folder the snapshots will be stored in a `snapshots` folder. If your tests are in a `__tests__` folder then they they'll be stored in a `__snapshots__` folder. + +Say you have `~/project/test/main.js` which contains snapshot assertions. AVA will create two files: + +* `~/project/test/snapshots/main.js.snap` +* `~/project/test/snapshots/main.js.md` + +The first file contains the actual snapshot and is required for future comparisons. The second file contains your *snapshot report*. It's regenerated when you update your snapshots. If you commit it to source control you can diff it to see the changes to your snapshot. + +AVA will show why your snapshot assertion failed: + + + +You can then check your code. If the change was intentional you can use the `--update-snapshots` (or `-u`) flag to update the snapshots: + +```console +$ ava --update-snapshots +``` + +You can specify a fixed location for storing the snapshot files in AVA's [`package.json` configuration](#configuration): + +```json +{ + "ava": { + "snapshotDir": "custom-directory" + } +} +``` + +The snapshot files will be saved in a directory structure that mirrors that of your test files. + +If you are running AVA against precompiled test files, AVA will try and use source maps to determine the location of the original files. Snapshots will be stored next to these files, following the same rules as if AVA had executed the original files directly. This is great if you're writing your tests in TypeScript (see our [TypeScript recipe](docs/recipes/typescript.md)). + +### Skipping assertions + +Any assertion can be skipped using the `skip` modifier. Skipped assertions are still counted, so there is no need to change your planned assertion count. + +```js +test('skip assertion', t => { + t.plan(2); + t.is.skip(foo(), 5); // No need to change your plan count when skipping + t.is(1, 1); +}); +``` + +### Enhanced assertion messages + +AVA comes with [`power-assert`](https://github.com/power-assert-js/power-assert) built-in, giving you more descriptive assertion messages. It reads your test and tries to infer more information from the code. + +Let's take this example, using Node's standard [`assert` library](https://nodejs.org/api/assert.html): + +```js +const a = /foo/; +const b = 'bar'; +const c = 'baz'; +require('assert').ok(a.test(b) || b === c); +``` + +If you paste that into a Node REPL it'll return: + +``` +AssertionError: false == true +``` + +In AVA however, this test: + +```js +test('enhanced assertions', t => { + const a = /foo/; + const b = 'bar'; + const c = 'baz'; + t.true(a.test(b) || b === c); +}); +``` + +Will output: + +``` +t.true(a.test(b) || b === c) + | | | | + | "bar" "bar" "baz" + false +``` + +## Process isolation + +Each test file is run in a separate Node.js process. This allows you to change the global state or overriding a built-in in one test file, without affecting another. It's also great for performance on modern multi-core processors, allowing multiple test files to execute in parallel. + +AVA will set `process.env.NODE_ENV` to `test`, unless the `NODE_ENV` environment variable has been set. This is useful if the code you're testing has test defaults (for example when picking what database to connect to, or environment-specific Babel options). It may cause your code or its dependencies to behave differently though. Note that `'NODE_ENV' in process.env` will always be `true`. + +## Tips + +### Temp files + +Running tests concurrently comes with some challenges, doing file IO is one. + +Usually, serial tests create temp directories in the current test directory and clean them up at the end. This won't work when you run tests concurrently as tests will conflict with each other. The correct way to do it is to use a new temp directory for each test. The [`tempfile`](https://github.com/sindresorhus/tempfile) and [`temp-write`](https://github.com/sindresorhus/temp-write) modules can be helpful. + +### Code coverage + +You can't use [`istanbul`](https://github.com/gotwarlost/istanbul) for code coverage as AVA [spawns the test files](#process-isolation). You can use [`nyc`](https://github.com/bcoe/nyc) instead, which is basically `istanbul` with support for subprocesses. + +As of version `5.0.0` it uses source maps to report coverage for your actual code, regardless of transpilation. Make sure that the code you're testing includes an inline source map or references a source map file. If you use `babel-register` you can set the `sourceMaps` option in your Babel config to `inline`. + +### Common pitfalls + +We have a growing list of [common pitfalls](docs/common-pitfalls.md) you may experience while using AVA. If you encounter any issues you think are common, comment in [this issue](https://github.com/avajs/ava/issues/404). + +## FAQ + +### Why not `mocha`, `tape`, `tap`? + +Mocha requires you to use implicit globals like `describe` and `it` with the default interface (which most people use). It's not very opinionated and executes tests serially without process isolation, making it slow. + +Tape and tap are pretty good. AVA is highly inspired by their syntax. They too execute tests serially. Their default [TAP](https://testanything.org) output isn't very user-friendly though so you always end up using an external tap reporter. + +In contrast AVA is highly opinionated and runs tests concurrently, with a separate process for each test file. Its default reporter is easy on the eyes and yet AVA still supports TAP output through a CLI flag. + +### How is the name written and pronounced? + +AVA, not Ava or ava. Pronounced [/ˈeɪvə/ ay-və](media/pronunciation.m4a?raw=true). + +### What is the header background? + +It's the [Andromeda galaxy](https://simple.wikipedia.org/wiki/Andromeda_galaxy). + +### What is the difference between concurrency and parallelism? + +[Concurrency is not parallelism. It enables parallelism.](https://stackoverflow.com/q/1050222) + +## Recipes + +- [Test setup](docs/recipes/test-setup.md) +- [Code coverage](docs/recipes/code-coverage.md) +- [Watch mode](docs/recipes/watch-mode.md) +- [Endpoint testing](docs/recipes/endpoint-testing.md) +- [When to use `t.plan()`](docs/recipes/when-to-use-plan.md) +- [Browser testing](docs/recipes/browser-testing.md) +- [TypeScript](docs/recipes/typescript.md) +- [Flow](docs/recipes/flow.md) +- [Configuring Babel][Babel recipe] +- [Using ES modules](docs/recipes/es-modules.md) +- [Passing arguments to your test files](docs/recipes/passing-arguments-to-your-test-files.md) +- [Testing React components](docs/recipes/react.md) +- [Testing Vue.js components](docs/recipes/vue.md) +- [JSPM and SystemJS](docs/recipes/jspm-systemjs.md) +- [Debugging tests with Chrome DevTools](docs/recipes/debugging-with-chrome-devtools.md) +- [Debugging tests with WebStorm](docs/recipes/debugging-with-webstorm.md) +- [Precompiling source files with webpack](docs/recipes/precompiling-with-webpack.md) +- [Isolated MongoDB integration tests](docs/recipes/isolated-mongodb-integration-tests.md) + +## Support + +- [Stack Overflow](https://stackoverflow.com/questions/tagged/ava) +- [Spectrum](https://spectrum.chat/ava) +- [Twitter](https://twitter.com/ava__js) + +## Related + +- [eslint-plugin-ava](https://github.com/avajs/eslint-plugin-ava) - Lint rules for AVA tests +- [sublime-ava](https://github.com/avajs/sublime-ava) - Snippets for AVA tests +- [atom-ava](https://github.com/avajs/atom-ava) - Snippets for AVA tests +- [vscode-ava](https://github.com/samverschueren/vscode-ava) - Snippets for AVA tests +- [gulp-ava](https://github.com/avajs/gulp-ava) - Run tests with gulp +- [grunt-ava](https://github.com/avajs/grunt-ava) - Run tests with grunt +- [More…](https://github.com/avajs/awesome-ava#packages) + +## Links + +- [AVA stickers, t-shirts, etc](https://www.redbubble.com/people/sindresorhus/works/30330590-ava-logo) +- [Awesome list](https://github.com/avajs/awesome-ava) +- [AVA Casts](http://avacasts.com) +- [More…](https://github.com/avajs/awesome-ava) + +## Team + +[![Mark Wubben](https://github.com/novemberborn.png?size=100)](https://github.com/novemberborn) | [![Sindre Sorhus](https://github.com/sindresorhus.png?size=100)](https://github.com/sindresorhus) | [![Vadim Demedes](https://github.com/vadimdemedes.png?size=100)](https://github.com/vadimdemedes) +---|---|--- +[Mark Wubben](https://novemberborn.net) | [Sindre Sorhus](http://sindresorhus.com) | [Vadim Demedes](https://github.com/vadimdemedes) + +###### Former + +- [Kevin Mårtensson](https://github.com/kevva) +- [James Talmage](https://github.com/jamestalmage) +- [Juan Soto](https://github.com/sotojuan) +- [Jeroen Engels](https://github.com/jfmengels) + + +
+
+
+
+ + AVA + +
+
+
+ +[Babel recipe]: docs/recipes/babel.md From 74ac01e26cef8748ecb4216ddbba42beebf88618 Mon Sep 17 00:00:00 2001 From: Kyoz Date: Thu, 26 Jul 2018 23:37:59 +0700 Subject: [PATCH 3/7] Update vietnamese translation for readme.md --- vi_VN/code-of-conduct.md | 2 +- vi_VN/contributing.md | 2 +- vi_VN/readme.md | 362 +++++++++++++++++++-------------------- 3 files changed, 183 insertions(+), 183 deletions(-) diff --git a/vi_VN/code-of-conduct.md b/vi_VN/code-of-conduct.md index 7f868559..c0e5618e 100644 --- a/vi_VN/code-of-conduct.md +++ b/vi_VN/code-of-conduct.md @@ -1,6 +1,6 @@ # Giao ước quy tắc ứng xử của cộng tác viên -Các bản dịch: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/code-of-conduct.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/code-of-conduct.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/code-of-conduct.md), [日本語](https://github.com/avajs/ava-docs/blob/master/ja_JP/code-of-conduct.md), [Português](https://github.com/avajs/ava-docs/blob/master/pt_BR/code-of-conduct.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/code-of-conduct.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/code-of-conduct.md) +Các bản dịch: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/code-of-conduct.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/code-of-conduct.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/code-of-conduct.md), [日本語](https://github.com/avajs/ava-docs/blob/master/ja_JP/code-of-conduct.md), [Português](https://github.com/avajs/ava-docs/blob/master/pt_BR/code-of-conduct.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/code-of-conduct.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/code-of-conduct.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/code-of-conduct.md) ## Cam kết của chúng tôi diff --git a/vi_VN/contributing.md b/vi_VN/contributing.md index ffd66e1f..8993ed18 100644 --- a/vi_VN/contributing.md +++ b/vi_VN/contributing.md @@ -4,7 +4,7 @@ Xin lưu ý rằng dự án này được phát hành với [Quy tắc ứng xử của cộng tác viên](code-of-conduct.md). Để tham gia vào dự án này, bạn phải đồng ý tuân theo các điều khoản của quy tắc trên. -Các bản dịch: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/contributing.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/contributing.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/contributing.md), [日本語](https://github.com/avajs/ava-docs/blob/master/ja_JP/contributing.md), [Português](https://github.com/avajs/ava-docs/blob/master/pt_BR/contributing.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/contributing.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/contributing.md) +Các bản dịch: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/contributing.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/contributing.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/contributing.md), [日本語](https://github.com/avajs/ava-docs/blob/master/ja_JP/contributing.md), [Português](https://github.com/avajs/ava-docs/blob/master/pt_BR/contributing.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/contributing.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/contributing.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/contributing.md) ## Tôi có thể đóng góp như thế nào? diff --git a/vi_VN/readme.md b/vi_VN/readme.md index 7e28f557..afd90577 100644 --- a/vi_VN/readme.md +++ b/vi_VN/readme.md @@ -1,7 +1,7 @@ ___ **Lưu ý của người phiên dịch** -Đây là bản dịch của file [readme.md](https://github.com/avajs/ava/blob/master/readme.md). Đây là [liên kết](https://github.com/avajs/ava/compare/d5dd981d0283303ad6cee62b14a59318d2316c85...master#diff-0730bb7c2e8f9ea2438b52e419dd86c9) để thấy sự khác biệt với nhánh chính của AVA (Nếu bạn nhấp vào liên kết mà không thấy có sự thay đổi đối với tệp `readme.md` thì có nghĩa là bản dịch đã được cập nhật). +Đây là bản dịch của file [readme.md](https://github.com/avajs/ava/blob/master/readme.md). Đây là [liên kết]() để thấy sự khác biệt với nhánh chính của AVA (Nếu bạn nhấp vào liên kết mà không thấy có sự thay đổi đối với file `readme.md` thì có nghĩa là bản dịch đã được cập nhật). ___ # [![AVA](media/header.png)](https://ava.li) @@ -14,56 +14,56 @@ Mặc dù JavaScript là một ngôn ngữ đơn luồng, nhưng IO trong Node.j ![](https://github.com/avajs/ava/blob/master/media/mini-reporter.gif) -*Read our [contributing guide](contributing.md) if you're looking to contribute (issues/PRs/etc).* +*Đọc [hướng dẫn đóng góp](contributing.md) nếu bạn muốn đóng góp (issues/PRs/.v.v).* -Follow the [AVA Twitter account](https://twitter.com/ava__js) for updates. +Theo dõi [Tài khoản Twitter của AVA](https://twitter.com/ava__js) để biết các cập nhật mới. -**This documentation covers the 1.0 beta releases, which use Babel 7. The last release that uses Babel 6 is [`v0.25.0`](https://github.com/avajs/ava/tree/v0.25.0).** +**Tài liệu này thể theo phiên bản 1.0 beta, sử dụng Babel 7. Phiên bản mới nhất sử dụng Babel 6 là [`v0.25.0`](https://github.com/avajs/ava/tree/v0.25.0).** -Translations: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/readme.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/readme.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/readme.md), [日本語](https://github.com/avajs/ava-docs/blob/master/ja_JP/readme.md), [한국어](https://github.com/avajs/ava-docs/blob/master/ko_KR/readme.md), [Português](https://github.com/avajs/ava-docs/blob/master/pt_BR/readme.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/readme.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/readme.md) +Các bản dịch [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/readme.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/readme.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/readme.md), [日本語](https://github.com/avajs/ava-docs/blob/master/ja_JP/readme.md), [한국어](https://github.com/avajs/ava-docs/blob/master/ko_KR/readme.md), [Português](https://github.com/avajs/ava-docs/blob/master/pt_BR/readme.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/readme.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/readme.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/readme.md) -## Contents +## Nội dung -- [Usage](#usage) -- [CLI Usage](#cli) -- [Debugging](#debugging) -- [Reporters](#reporters) -- [Configuration](#configuration) -- [Documentation](#documentation) +- [Cách sử dụng](#cách-sử-dụng) +- [Cách sử dụng CLI](#cli) +- [Kiểm lỗi](#kiểm-lỗi) +- [Báo cáo](#báo-cáo) +- [Cấu hình](#cấu-hình) +- [Tài liệu](#tài-liệu) - [API](#api) -- [Assertions](#assertions) -- [Snapshot testing](#snapshot-testing) -- [Tips](#tips) +- [Xác nhận giá trị](#xác-nhận-giá-trị) +- [Test với snapshot](#test-với-snapshot) +- [Các mẹo](#các-mẹo) - [FAQ](#faq) -- [Recipes](#recipes) -- [Support](#support) -- [Related](#related) -- [Links](#links) -- [Team](#team) - - -## Why AVA? - -- Minimal and fast -- Simple test syntax -- Runs tests concurrently -- Enforces writing atomic tests -- No implicit globals -- Includes TypeScript & Flow type definitions -- [Magic assert](#magic-assert) -- [Isolated environment for each test file](#process-isolation) -- [Write your tests using the latest JavaScript syntax](#latest-javascript-support) -- [Promise support](#promise-support) -- [Async function support](#async-function-support) -- [Observable support](#observable-support) -- [Enhanced assertion messages](#enhanced-assertion-messages) -- [Automatic parallel test runs in CI](#parallel-runs-in-ci) +- [Các công thức](#các-công-thức) +- [Hỗ trợ](#hỗ-trợ) +- [Có liên quan](#có-liên-quan) +- [Các liên kết](#các-liên-kết) +- [Nhóm phát triển](#nhóm-phát-triển) + + +## Tại sao dùng AVA? + +- Nhỏ gọn và nhanh chóng +- Cú pháp để test đơn giản +- Chạy test đồng thời +- Ép buộc viết test chi tiết +- Không có giá trị toàn cục hiện hữu +- Bao gồm các định nghĩa kiểu TypeScript & Flow +- [Cú pháp test thần kì](#cú-pháp-test-thần-kì) +- [Môi trường riêng biệt cho mỗi file test](#môi-trường-riêng-biệt-cho-mỗi-file-test) +- [Viết test sử dụng cú pháp Javascript mới nhất](#latest-javascript-support) +- [Hỗ trợ Promise](#promise-support) +- [Hỗ trợ hàm bất đồng bộ](#async-function-support) +- [Hỗ trợ Observable](#observable-support) +- [Cải thiện thông báo test](#enhanced-assertion-messages) +- [Test chạy song song và tự động trên CI](#parallel-runs-in-ci) - [TAP reporter](#tap-reporter) -- [Automatic migration from other test runners](https://github.com/avajs/ava-codemods#migrating-to-ava) +- [Tự động chuyển đổi từ các test runner khác](https://github.com/avajs/ava-codemods#migrating-to-ava) -## Test syntax +## Cú pháp test ```js import test from 'ava'; @@ -73,17 +73,17 @@ test('arrays are equal', t => { }); ``` -## Usage +## Cách sử dụng -### Add AVA to your project +### Thêm AVA vào dự án của bạn -To install and set up AVA, run: +Để cài đặt AVA, thực thi lệnh: ```console $ npx create-ava --next ``` -Your `package.json` will then look like this: +File `package.json` sau đó sẽ như thế này: ```json { @@ -97,21 +97,21 @@ Your `package.json` will then look like this: } ``` -Initialization will work with npm and Yarn, but running `npx` requires [`npm@5.2.0`](https://github.com/npm/npm/releases/tag/v5.2.0) or greater to be installed. Otherwise, you'll have to manually install `ava` and configure the `test` script in your `package.json` as per above: +Việc khởi tạo sẽ hoạt động với npm và Yarn, nhưng để chạy 'npx' bạn cần có [`npm@5.2.0`](https://github.com/npm/npm/releases/tag/v5.2.0) hoặc phiên bản mới hơn. Nếu không, bạn sẽ phải tự cài đặt `ava` và cấu hình `test` script trong `package.json` như bên trên: ```console $ npm install --save-dev --save-exact ava@next ``` -Or if you prefer using Yarn: +Hoặc nếu bạn thích dùng Yarn: ```console $ yarn add ava@next --dev --exact ``` -### Create your test file +### Tạo file test của bạn -Create a file named `test.js` in the project root directory: +Tạo một file có tên `test.js` trong thư mục gốc của dự án với nội dung như sau: ```js import test from 'ava'; @@ -127,94 +127,94 @@ test('bar', async t => { }); ``` -### Run it +### Chạy test ```console $ npm test ``` -### Watch it +### Theo dõi test ```console $ npm test -- --watch ``` -AVA comes with an intelligent watch mode. [Learn more in its recipe](docs/recipes/watch-mode.md). +AVA đi kèm với chế độ theo dõi thông minh. [Xem thêm tại công thức](docs/recipes/watch-mode.md). -### Supported Node.js versions +### Các phiên bản Node.js được hỗ trợ -AVA supports the latest release of any major version that [is supported by Node.js itself](https://github.com/nodejs/Release#release-schedule). Read more in our [support statement](docs/support-statement.md). +AVA hỗ trợ các bản release mới nhất của bất kì phiên bản chính nào [được hỗ trợ bởi chính Node.js](https://github.com/nodejs/Release#release-schedule). Đọc thêm tại [các sự hỗ trợ](docs/support-statement.md) của chúng tôi. ## CLI ```console $ ava --help - Usage + Cách dùng ava [ ...] - Options - --watch, -w Re-run tests when tests and source files change - --match, -m Only run tests with matching title (Can be repeated) - --update-snapshots, -u Update snapshots - --fail-fast Stop after first test failure - --timeout, -T Set global timeout - --serial, -s Run tests serially - --concurrency, -c Max number of test files running at the same time (Default: CPU cores) - --verbose, -v Enable verbose output - --tap, -t Generate TAP output - --color Force color output - --no-color Disable color output - - Examples + Các tùy chọn + --watch, -w Chạy lại test khi test và file test có sự thay đổi + --match, -m Chỉ chạy tets với các tiêu đề phù hợp (Có thể lặp lại) + --update-snapshots, -u Cập nhật snapshots + --fail-fast Dừng ngay khi test đầu tiên thất bại + --timeout, -T Thiết lập thời gian timeout toàn cục + --serial, -s Chạy các test theo từng kỳ + --concurrency, -c Số test tối đa cùng chạy ở một thời điểm (Mặc định: Số nhân của CPU) + --verbose, -v Hiển thị chi tiết các output + --tap, -t Tạo TAP output + --color Màu của output + --no-color Vô hiệu hóa màu cho output + + Ví dụ ava ava test.js test2.js ava test-*.js ava test - Default patterns when no arguments: + Khuôn mẫu mặc định khi không có tham số: test.js test-*.js test/**/*.js **/__tests__/**/*.js **/*.test.js ``` -*Note that the CLI will use your local install of AVA when available, even when run globally.* +*Lưu ý rằng CLI sẽ sử dụng cài đặt cục bộ của AVA khi có thể, ngay cả khi bạn chạy lệnh toàn cục.* -Directories are recursed, with all `*.js` files being treated as test files. Directories named `fixtures`, `helpers` and `node_modules` are *always* ignored. So are files starting with `_` which allows you to place helpers in the same directory as your test files. +Các thư mục được đệ quy, tất cả các file có đuôi `*.js` sẽ được xem như là file test. Các thư mục có tên `fixtures`, `helpers` và `node_modules` sẽ *luôn* bị bỏ qua. Các file có tên bắt đầu bằng `_` sẽ cho phép bạn đặt những code hữu ích trong cùng thư mục với file test của bạn. -When using `npm test`, you can pass positional arguments directly `npm test test2.js`, but flags needs to be passed like `npm test -- --verbose`. +Khi sử dụng lệnh `npm test`, bạn có thể truyền vào trực tiếp các tham số để chỉ rõ file cần test `npm test test2.js`, nhưng các tham số nên được truyền vào như thế như sau `npm test -- --verbose`. -## Debugging +## Kiểm lỗi -AVA runs tests in child processes, so to debug tests, you need to do this workaround: +AVA chạy các test trong các process con, do đó, để kiểm lỗi, bạn cần thực hiện giải pháp sau: ```console $ node --inspect node_modules/ava/profile.js some/test/file.js ``` -### Debugger-specific tips +### Các mẹo riêng để gỡ lỗi - [Chrome DevTools](docs/recipes/debugging-with-chrome-devtools.md) - [WebStorm](docs/recipes/debugging-with-webstorm.md) - [Visual Studio Code](docs/recipes/debugging-with-vscode.md) -## Reporters +## Báo cáo -### Mini-reporter +### Báo cáo mini -The mini-reporter is the default reporter. +Báo cáo mini là báo cáo mặc định. -### Verbose reporter +### Báo cáo chi tiết -Use the `--verbose` flag to enable the verbose reporter. This is always used in CI environments unless the [TAP reporter](#tap-reporter) is enabled. +Dùng tham số `--verbose` để kích hoạt báo cáo chi tiết. Báo cáo chi tiết sẽ luôn được dùng trong môi trường CI, trừ khi [Báo cáo TAP](#tap-reporter) đã được kích hoạt. -### TAP reporter +### Báo cáo TAP -AVA supports the TAP format and thus is compatible with [any TAP reporter](https://github.com/sindresorhus/awesome-tap#reporters). Use the `--tap` flag to enable TAP output. +AVA hỗ trợ định dạng TAP và do đó tương thích với [Bất kì báo cáo TAP nào khác](https://github.com/sindresorhus/awesome-tap#reporters). Sử dụng tham số `--tap` để bật báo cáo TAP. ```console $ ava --tap | tap-nyan @@ -222,24 +222,24 @@ $ ava --tap | tap-nyan -Please note that the TAP reporter is unavailable when using [watch mode](#watch-it). +Lưu ý rằng báo cáo TAP sẽ không khả dụng khi sử dụng [Theo dõi test](#theo-dõi-test). -### Magic assert +### Cú pháp test thần kì -AVA adds code excerpts and clean diffs for actual and expected values. If values in the assertion are objects or arrays, only a diff is displayed, to remove the noise and focus on the problem. The diff is syntax-highlighted too! If you are comparing strings, both single and multi line, AVA displays a different kind of output, highlighting the added or missing characters. +AVA thêm vào các trích đoạn code và các sự khác biệt rõ ràng cho từng giá trị thực tế và giá trị mong muốn. Nếu giá trị của cú pháp test có dạng đối tượng hoặc chuỗi, sẽ chỉ có một sự khác biệt được hiển thị, để loại bỏ đi các khác biệt nhiễu và tập trung vào vấn đề. Các sự khác biệt này cũng được làm nổi bật cú pháp! Nếu bạn đang so sánh chuỗi, cả trên 1 dòng và nhiều dòng, AVA sẽ hiển thị một loại output khác, AVA sẽ làm nổi bật các kí tự được thêm vào hoặc bị loại bỏ đi. ![](media/magic-assert-combined.png) -### Clean stack traces +### Dọn dẹp stack traces -AVA automatically removes unrelated lines in stack traces, allowing you to find the source of an error much faster, as seen above. +AVA sẽ tự động xóa đi các dòng không liên quan trong stack traces, cho phép bạn tìm ra nguồn gốc của lỗi nhanh hơn rất nhiều, như đã thấy ở trên. -## Configuration +## Cấu hình -All of the CLI options can be configured in the `ava` section of either your `package.json` or an `ava.config.js` file. This allows you to modify the default behavior of the `ava` command, so you don't have to repeatedly type the same options on the command prompt. +Tất cả các tùy chọn của CLI đều có thể được cấu hình trong phần `ava` của file `package.json` hoặc `ava.config.js`. Điều này cho phép bạn thay đổi hành vi mặc định của lệnh `ava`, do đó bạn không phải gõ lặp đi lặp lại nhiều lần các tùy chọn. -To ignore a file or directory, prefix the pattern with an `!` (exclamation mark). +Để bỏ qua một file hoặc một thư mục, hãy thêm tiền tố vào pattern bằng dấu `!` (Dấu chấm than). ```json { @@ -276,34 +276,34 @@ To ignore a file or directory, prefix the pattern with an `!` (exclamation mark) } ``` -Arguments passed to the CLI will always take precedence over the configuration in `package.json`. +Các tham số được truyền vào CLI sẽ luôn được ưu tiên hơn các tham số đã cấu hình trong file `package.json`. -### Options +### Các tùy chọn -- `files`: file & directory paths and glob patterns that select which files AVA will run tests from. Files with an underscore prefix are ignored. All matched files in selected directories are run. By default only selects files with `js` extensions, even if the glob pattern matches other files. Specify `extensions` and `babel.extensions` to allow other file extensions -- `source`: files that, when changed, cause tests to be re-run in watch mode. See the [watch mode recipe for details](https://github.com/avajs/ava/blob/master/docs/recipes/watch-mode.md#source-files-and-test-files) -- `match`: not typically useful in the `package.json` configuration, but equivalent to [specifying `--match` on the CLI](#running-tests-with-matching-titles) -- `cache`: cache compiled test and helper files under `node_modules/.cache/ava`. If `false`, files are cached in a temporary directory instead -- `failFast`: stop running further tests once a test fails -- `failWithoutAssertions`: if `false`, does not fail a test if it doesn't run [assertions](#assertions) -- `tap`: if `true`, enables the [TAP reporter](#tap-reporter) -- `snapshotDir`: specifies a fixed location for storing snapshot files. Use this if your snapshots are ending up in the wrong location -- `compileEnhancements`: if `false`, disables [power-assert](https://github.com/power-assert-js/power-assert) — which otherwise helps provide more descriptive error messages — and detection of improper use of the `t.throws()` assertion -- `extensions`: extensions of test files that are not precompiled using AVA's Babel presets. Note that files are still compiled to enable power-assert and other features, so you may also need to set `compileEnhancements` to `false` if your files are not valid JavaScript. Setting this overrides the default `"js"` value, so make sure to include that extension in the list, as long as it's not included in `babel.extensions` -- `require`: extra modules to require before tests are run. Modules are required in the [worker processes](#process-isolation) -- `babel`: test file specific Babel options. See our [Babel recipe] for more details -- `babel.extensions`: extensions of test files that will be precompiled using AVA's Babel presets. Setting this overrides the default `"js"` value, so make sure to include that extension in the list +- `files`: đường dẫn của file, thư mục và các pattern toàn cục nhằm xác định các file test mà AVA sẽ thực thi. Files với tiền tố là dấu gạch dưới sẽ bị bỏ qua. Tất cả các file trong thư mục đã được chọn đều sẽ được thực thi. Mặc định, AVA chỉ chọn các file có đuôi mở rộng là `js`, ngay cả khi pattern toàn cục khớp với các file khác. Chỉ định `extensions` và `babel.extensions` để cho phép file với đuôi mở rộng khác. +- `source`: các tệp mà khi có sự thay đổi, sẽ làm cho các test chạy lại trong chế độ theo dõi. Xem [các công thức để biết thêm chi tiết](https://github.com/avajs/ava/blob/master/docs/recipes/watch-mode.md#source-files-and-test-files) +- `match`: không hữu ích lắm trong việc cấu hình file `package.json`, nhưng tương đương với [chỉ định `--mactch` trong CLI](#thực-thi-test-với-các-tiêu-đề-trùng-khớp) +- `cache`: cache biên dịch các file test và file hỗ trợ bằng `node_modules/.cache/ava`. Nếu giá trị là `false`, các file sẽ được lưu trong thư mục tạm thời +- `failFast`: ngừng thực thi test khi có một test chạy không thành công +- `failWithoutAssertions`: nếu giá trị là `false`, không tính một file test là thất bại nếu như nó chưa được chạy [Xác nhận giá trị](#xác-nhận-giá-trị) +- `tap`: nếu giá trị là `true`, kích hoạt [Báo cáo TAP](#báo-cáo-tap) +- `snapshotDir`: chỉ đị vị trí cố định để lưu các file snapshot. Sử dụng chức năng này nếu các file snapshot của bạn nằm sai vị trí +- `compileEnhancements`: nếu giá trị là `false`, vô hiệu hóa [power-assert](https://github.com/power-assert-js/power-assert) — giúp cung cấp thêm các thông báo mô tả lỗi — và phát hiện việc sử dụng `t.throws()` không đúng cách +- `extensions`: phần mở rộng của các file test không được biên dịch trước sử dụng các thiết lập sẵn của Babel trong AVA. Lưu ý rằng các file vẫn được biên dịch để kích hoạt power-assert và cách tính năng khác, vì vậy bạn có thể cần phải thiết lập `compileEnhancements` thành `false` nếu các file của bạn không đúng định dạng Javascript. Thiết lập này sẽ được ghi đè lên giá trị `"js"` mặc định, vì vậy hãy đảm bảo rằng bạn đã thêm phần mở rộng đó vào danh sách, miễn là nó không nằm trong `babel.extensions` +- `require`: các module bổ sung cần thiết trước khi chạy test. Các module cần thiế trong [worker processes](#process-isolation) +- `babel`: các tùy chọn cài đặt Babel cụ thể của file test. Xem [Công thức Babel] của chúng tôi để có thêm chi tiết +- `babel.extensions`: các phần mở rộng của các file test sẽ được biên dịch trước bằng các thiết lập Babel của AVA. Giá trị này sẽ được ghi đè lên giá trị `"js"` mặc định, vì vậy hãy đảm bảo rằng bạn đã thêm phần mở rộng đó trong danh sách -Note that providing files on the CLI overrides the `files` option. If you've configured a glob pattern, for instance `test/**/*.test.js`, you may want to repeat it when using the CLI: `ava 'test/integration/*.test.js'`. +Lưu ý rằng việc cung cấp các file trên CLI sẽ ghi đè lên tùy chọn `files`. Nếu bạn đã cấu hình một pattern toàn cục, ví dụ `test/**/*.test.js`, bạn có lẽ sẽ muốn lặp lại nó khi sử dụng CLI: `ava 'test/integration/*.test.js'`. -### Using `ava.config.js` +### Sử dụng `ava.config.js` -To use an `ava.config.js` file: +Để sử dụng file cấu hình `ava.config.js`: - 1. It must be in the same directory as your `package.json` - 2. Your `package.json` must not contain an `ava` property (or, if it does, it must be an empty object) + 1. Nó phải nằm trong cùng thư mục với file `package.json` của bạn + 2. File `package.json` của bạn không được chứa thuộc tính `ava` (hoặc nếu có, nó phải là một đối tượng trống) -The config file must have a default export, using ES modules. It can either be a plain object or a factory function which returns a plain object: +File cấu hình phải có một export mặc định, sử dụng các module ES. Nó có thể là một đối tượng đơn giản, hoặc một hàm factory nào đó trả về một đối tượng đơn giản: ```js export default { @@ -319,7 +319,7 @@ export default function factory() { }; ``` -The factory function is called with an object containing a `projectDir` property, which you could use to change the returned configuration: +Hàm factory được gọi với một đối tượng chứa thuộc tính `projectDir`, thứ mà bạn có thể sử dụng để thay đổi cấu hình trả về: ```js export default ({projectDir}) => { @@ -335,25 +335,25 @@ export default ({projectDir}) => { }; ``` -Note that the final configuration must not be a promise. +Lưu ý rằng cấu hình cuối cùng không được là một promise. -## Documentation +## Tài liệu -Tests are run concurrently. You can specify synchronous and asynchronous tests. Tests are considered synchronous unless you return a promise or [observable](https://github.com/zenparsing/zen-observable). +Các test được thực hiện đồng thời. Bạn có thể chỉ định các test chạy đồng bộ và không động bộ. Các test được con là đồng bộ, trừ khi bạn trả về một Promise hoặc [observable](https://github.com/zenparsing/zen-observable). -We *highly* recommend the use of [async functions](#async-function-support). They make asynchronous code concise and readable, and they implicitly return a promise so you don't have to. +Chúng tôi *khuyến khích* sử dụng [async-functions](#hỗ-trợ-async-function). Chúng giúp cho code không đồng bộ súc tích và có thể đọc được, và chúng cũng ngầm trả về một promise thay bạn. -If you're unable to use promises or observables, you may enable "callback mode" by defining your test with `test.cb([title], fn)`. Tests declared this way **must** be manually ended with `t.end()`. This mode is mainly intended for testing callback-style APIs. However, we would strongly recommend [promisifying](https://github.com/sindresorhus/pify) callback-style APIs instead of using "callback mode", as this results in more correct and readable tests. +Nếu bạn không thể sử dụng promises hay observables, bạn nên kích hoạt "callback mode" bằng cách định nghĩa các test của mình với `test.cb([title], fn)`. Các test được khai bao theo cách này **phải** được kết thúc một cách thủ công với `t.end()`. Chế độ này chủ yếu được dùng để test các callback-style APIs. Tuy nhiên, chúng tôi đặc biệt khuyến khích bạn dùng [promisifying](https://github.com/sindresorhus/pify) callback-style APIs thay vì sử dụng "callback mode", vì nó giúp test chạy chính xác và dễ đọc hơn. -You must define all tests synchronously. They can't be defined inside `setTimeout`, `setImmediate`, etc. +Bạn phải định nghĩa tất cả các test một cách đồng bộ. Chúng không thể được định nghĩa bên trong `setTimeout`, `setImmediate`, v.v. -AVA tries to run test files with their current working directory set to the directory that contains your `package.json` file. +AVA sẽ cố gắng chạy các file test với thư mục làm việc hiện tại của chúng có chứa file `package.json`. -### Creating tests +### Tạo các test -To create a test you call the `test` function you imported from AVA. Provide the required title and implementation function. Titles must be unique within each test file. The function will be called when your test is run. It's passed an [execution object](#t) as its first argument. +Để tạo một test bạn phải gọi hàm `test` bạn đã import vào từ AVA. Cung cấp tiêu đề yêu cầu và hàm chức năng cho nó. Hàm chức năng sẽ được gọi khi bạn chạy test của mình. Nó sẽ truyền vào [execution object](#t) là đối số đầu tiên của nó. -**Note:** In order for the [enhanced assertion messages](#enhanced-assertion-messages) to behave correctly, the first argument **must** be named `t`. +**Lưu ý:** Để [các thông báo xác nhận nâng cao](#thông-báo-xác-nhận-nâng-cao) hoạt động chính xác, đối số đầu tiên **phải** được đặt tên là `t`. ```js import test from 'ava'; @@ -363,15 +363,15 @@ test('my passing test', t => { }); ``` -### Assertion planning +### Lập kế hoạch xác nhận -Assertion plans ensure tests only pass when a specific number of assertions have been executed. They'll help you catch cases where tests exit too early. They'll also cause tests to fail if too many assertions are executed, which can be useful if you have assertions inside callbacks or loops. +Các kế hoạch xác nhận phải đảm bảo rằng các test chỉ thành công khi một một số nhất định các kiểm thử giá trị đã được thực thi. Chúng sẽ giúp bạn nắm bắt các trường hợp test kết thúc quá sớm. Chúng cũng sẽ làm cho test thất bại nếu có quá nhiều kiểm thử giá trị được thực thi, điều này sẽ hữu ích nếu bạn có các xác nhận bên trong các callback hoặc các vòng lặp. -If you do not specify an assertion plan, your test will still fail if no assertions are executed. Set the `failWithoutAssertions` option to `false` in AVA's [`package.json` configuration](#configuration) to disable this behavior. +Nếu bạn không chỉ định rõ ràng một kế hoạch xác nhận, test của bạn vẫn sẽ thất bại nếu không có bất cứ xác nhận nào được thực thi. Thiết lập tùy chọn `failWithoutAssertions` thành `false` trong AVA's [Cấu hình `package.json`](#cấu-hình) để vô hiệu hóa hành vi này. -Note that, unlike [`tap`](https://www.npmjs.com/package/tap) and [`tape`](https://www.npmjs.com/package/tape), AVA does *not* automatically end a test when the planned assertion count is reached. +Lưu ý rằng, không giống như [`tap`](https://www.npmjs.com/package/tap) và [`tape`](https://www.npmjs.com/package/tape), AVA *không* tự động kết thúc một test khi đã đạt được số kế hoạch xác nhận dự kiến. -These examples will result in a passed test: +Các ví dụ sau đây sẽ có kết quả là một test đã thành công: ```js test('resolves with 3', t => { @@ -392,7 +392,7 @@ test.cb('invokes callback', t => { }); ``` -These won't: +Những ví dụ này thì không: ```js test('loops twice', t => { @@ -401,7 +401,7 @@ test('loops twice', t => { for (let i = 0; i < 3; i++) { t.true(i < 3); } -}); // Fails, 3 assertions are executed which is too many +}); // Thất bại, 3 kiểm thử đã được thực thi, được xem là quá nhiều test('invokes callback synchronously', t => { t.plan(1); @@ -409,12 +409,12 @@ test('invokes callback synchronously', t => { someAsyncFunction(() => { t.pass(); }); -}); // Fails, the test ends synchronously before the assertion is executed +}); // Thất bại, test kết thúc một cách đồng bộ trước khi kiểm thử được thực thi ``` -### Running tests serially +### Thực thi các test theo từng kỳ -Tests are run concurrently by default, however, sometimes you have to write tests that cannot run concurrently. In these rare cases you can use the `.serial` modifier. It will force those tests to run serially *before* the concurrent ones. +Theo mặc định, các test được chạy đồng thời, tuy nhiên, đôi khi bạn phải viết các test không thể chạy đồng thời. Trong các trường hợp hiếm hoi này, bạn có thể dùng `.serial`. Nó sẽ ép buộc các bài kiểm tra đó chạy ngay lập tức *trước* các test chạy đồng thời. ```js test.serial('passes serially', t => { @@ -422,13 +422,13 @@ test.serial('passes serially', t => { }); ``` -Note that this only applies to tests within a particular test file. AVA will still run multiple tests files at the same time unless you pass the [`--serial` CLI flag](#cli). +Lưu ý rằng điều này chỉ áp dụng cho các test trong một file test nhất định. AVA vẫn sẽ chạy nhiều file test cùng lúc trừ khi bạn truyền vào tham số [`--serial` CLI flag](#cli). -You can use the `.serial` modifier with all tests, hooks and even `.todo()`, but it's only available on the `test` function. +Bạn có thể sử dụng `.serial` với tất cả các test, hook hoặc tập chí `.todo()`, nhưng nó chỉ có sẵn trên hàm `test`. -### Running specific tests +### Thực thi một test cụ thể -During development it can be helpful to only run a few specific tests. This can be accomplished using the `.only` modifier: +Trong quá trình phát triển, đôi khi chỉ chạy một vài test cụ thể lại hữu ích. Điều này có thể được thực hiện bằng cách dùng `.only`: ```js test('will not be run', t => { @@ -440,59 +440,59 @@ test.only('will be run', t => { }); ``` -You can use the `.only` modifier with all tests. It cannot be used with hooks or `.todo()`. +Bạn có thể sử dụng `.only` với tất cả các test. Nó không thể được dùng với các hook hoặc `.todo()`. -*Note:* The `.only` modifier applies to the test file it's defined in, so if you run multiple test files, tests in other files will still run. If you want to only run the `test.only` test, provide just that test file to AVA. +*Lưu ý:* `.only` chỉ áp dụng cho tệp đã được xác định, vì vậy nếu bạn chạy nhiều test cùng lúc, các test ở các file khác vẫn sẽ chạy. Nếu bạn chỉ muốn thực thi một test `test.only`, chỉ cần cung cấp file test đó cho AVA. -### Running tests with matching titles +### Thực thi test với các tiêu đề trùng khớp -The `--match` flag allows you to run just the tests that have a matching title. This is achieved with simple wildcard patterns. Patterns are case insensitive. See [`matcher`](https://github.com/sindresorhus/matcher) for more details. +Tham số `--match` cho phép bạn chạy các test có tiêu đề trùng khớp, Điều này có thể thực hiện bằng cách sử dụng một wildcard patterns đơn giản. Các patterns không phân biệt chữ hoa thường. Xem [`matcher`](https://github.com/sindresorhus/matcher) để có thêm thông tin. -Match titles ending with `foo`: +Các tiêu đề trùng khớp kết thúc với `foo`: ```console $ ava --match='*foo' ``` -Match titles starting with `foo`: +Các tiêu đề trùng khớp bắt đầu với `foo`: ```console $ ava --match='foo*' ``` -Match titles containing `foo`: +Các tiêu đề trùng khớp có chứa `foo`: ```console $ ava --match='*foo*' ``` -Match titles that are *exactly* `foo` (albeit case insensitively): +Các tiêu đề trùng khớp là `foo` (mặc dù không phân biệt chữ hoa thường): ```console $ ava --match='foo' ``` -Match titles not containing `foo`: +Các tiêu đề trùng khớp không có chứa `foo`: ```console $ ava --match='!*foo*' ``` -Match titles starting with `foo` and ending with `bar`: +Các tiêu đề trùng khớp bắt đầu với `foo` và kết thúc với `bar`: ```console $ ava --match='foo*bar' ``` -Match titles starting with `foo` or ending with `bar`: +Các tiêu đề trùng khớp bắt đầu với `foo` hoặc kết thúc với `bar`: ```console $ ava --match='foo*' --match='*bar' ``` -Note that a match pattern takes precedence over the `.only` modifier. Only tests with an explicit title are matched. Tests without titles or whose title is derived from the implementation function will be skipped when `--match` is used. +Lưu ý rằng một pattern đối sánh được ưu tiên hơn `.only`. Chỉ các test có tiêu đề rõ ràng mới được đối sánh. Các test không có tiêu đề hoặc có tiêu đề bắt nguồn từ hàm thực thi sẽ bị bỏ qua khi `--match` được sử dụng. -Here's what happens when you run AVA with a match pattern of `*oo*` and the following tests: +Đây là những gì sẽ xảy ra nếu bạn chạy AVA với một pattern của `*oo*` và các test: ```js test('foo will run', t => { @@ -507,20 +507,20 @@ test.only('boo will run but not exclusively', t => { t.pass(); }); -// Won't run, no title +// Không chạy, không có tiêu đề test(function (t) { t.fail(); }); -// Won't run, no explicit title +// Không chạy, không có tiêu đề rõ ràng test(function foo(t) { t.fail(); }); ``` -### Skipping tests +### Bỏ qua test -Sometimes failing tests can be hard to fix. You can tell AVA to skip these tests using the `.skip` modifier. They'll still be shown in the output (as having been skipped) but are never run. +Đôi khi việc kiểm tra thất bại khó thể khó khắc phục. Bạn có thể yêu cầu AVA bỏ qua các test này bằng cách sử dụng `.skip`. Chúng sẽ vẫn được hiển thị trong output (là đã bị bỏ qua) nhưng không bao giờ thực thi. ```js test.skip('will not be run', t => { @@ -528,92 +528,92 @@ test.skip('will not be run', t => { }); ``` -You must specify the implementation function. You can use the `.skip` modifier with all tests and hooks, but not with `.todo()`. You can not apply further modifiers to `.skip`. +Bạn phải chỉ định hàm thực thi. Bạn có thể sử dụng `.skip` cho tất cả các test và hook, nhưng không thể dùng với `.todo()`. Bạn không thể áp dụng các modifiers khác với `.skip` ### Test placeholders ("todo") -You can use the `.todo` modifier when you're planning to write a test. Like skipped tests these placeholders are shown in the output. They only require a title; you cannot specify the implementation function. +Bạn có thể dùng `.todo` khi bạn định viết một test. Như khi các test được bỏ qua, các placeholders này sẽ được hiển thị trong output. Chúng chỉ cần có một tiêu đề; bạn không thể chỉ định hàm thực thi. ```js test.todo('will think about writing this later'); ``` -You can signal that you need to write a serial test: +Bạn có thể báo hiệu rằng bạn cần phải viết một test nối tiếp: ```js test.serial.todo('will think about writing this later'); ``` -### Failing tests +### Test thất bại -You can use the `.failing` modifier to document issues with your code that need to be fixed. Failing tests are run just like normal ones, but they are expected to fail, and will not break your build when they do. If a test marked as failing actually passes, it will be reported as an error and fail the build with a helpful message instructing you to remove the `.failing` modifier. +Bạn có thể dùng modifier `.failing` để ghi lại các vấn đề với code của bạn mà bạn sẽ cần phải chỉnh sửa. Test thất bại được thực thi giống như các test thông thường, và sẽ không phá vỡ build của bạn khi chúng thực hiện. Nếu một test được đánh dấu là không thực sự thành công, nó sẽ được báo cáo như là một lỗi và làm thất bại build với một thông báo hướng dẫn hứu ích giúp bạn loại bỏ modifier `.failing`. -This allows you to merge `.failing` tests before a fix is implemented without breaking CI. This is a great way to recognize good bug report PR's with a commit credit, even if the reporter is unable to actually fix the problem. +Điều này cho phép bạn kết hợp các test `.failing` trước khi một bản sửa lỗi được thêm vào mà không phá vỡ CI. Đây là một cách tuyệt vời để nhận ra các báo cáo lỗi tốt của các PR với một commit tin cậy, ngay cả khi người báo cáo không thể thực sự khắc phục vấn đề. ```js -// See: github.com/user/repo/issues/1234 +// Xem: github.com/user/repo/issues/1234 test.failing('demonstrate some bug', t => { - t.fail(); // Test will count as passed + t.fail(); // Test sẽ được tính là thành công }); ``` -### Before & after hooks +### Các hook trước và sau -AVA lets you register hooks that are run before and after your tests. This allows you to run setup and/or teardown code. +AVA cho phép bạn đăng ký các hook được chạy trước vào sau test. Điều này cho phép bạn setup và/hoặc teardown code. -`test.before()` registers a hook to be run before the first test in your test file. Similarly `test.after()` registers a hook to be run after the last test. Use `test.after.always()` to register a hook that will **always** run once your tests and other hooks complete. `.always()` hooks run regardless of whether there were earlier failures, so they are ideal for cleanup tasks. Note however that uncaught exceptions, unhandled rejections or timeouts will crash your tests, possibly preventing `.always()` hooks from running. +`test.before()` đăng ký một hook sẽ được chạy trước test đầu tiên trong file test của bạn. Tương tự `test.after()` đăng ký một hook sẽ chạy sau test cuối cùng. Sử dụng `test.after.always ()` để đăng ký mộc hook sẽ **luôn luôn** chạy sau khi test của bạn và các hook hoàn thành. Hook `.always()` sẽ chạy bất kể có lỗi trước đó hay không, vì vậy chúng rất lý tưởng cho các nhiệm vụ dọn dẹp. Tuy nhiên, lưu ý rằng các trường hợp ngoại lệ chưa được thực hiện, các rejection hoặc timeout sẽ phá hỏng test của bạn, thậm chí có thể ngăn cản hook `.always()` thực thi. -`test.beforeEach()` registers a hook to be run before each test in your test file. Similarly `test.afterEach()` a hook to be run after each test. Use `test.afterEach.always()` to register an after hook that is called even if other test hooks, or the test itself, fail. +`test.beforeEach()` đăng ký một hook sẽ chạy trước mỗi test trong file test của bạn. Tương tự `test.afterEach()` sẽ đăng ký một hook sẽ chạy sau mỗi test. Sử dụng `test.afterEach.always()` để đăng ký một hook sẽ được gọi ngay cả khi các hook hoặc bản thân test đó thất bại. -If a test is skipped with the `.skip` modifier, the respective `.beforeEach()`, `.afterEach()` and `.afterEach.always()` hooks are not run. Likewise, if all tests in a test file are skipped `.before()`, `.after()` and `.after.always()` hooks for the file are not run. +Nếu một test bị bỏ qua với `.skip`, các hook `.beforeEach()`, `.afterEach()` và `.afterEach.always()` sẽ không được thực thi. Tương tự vậy, nếu tất cả test trong một file bị bỏ qua thì các hook `.before()`, `.after()` và `.after.always()` sẽ không được thực thi. -Like `test()` these methods take an optional title and an implementation function. The title is shown if your hook fails to execute. The implementation is called with an [execution object](#t). You can use assertions in your hooks. You can also pass a [macro function](#test-macros) and additional arguments. +Giống như `test()`, các phương thức này nhận vào một tiêu đề và một hàm thực thi. Tiêu đề sẽ được hiển thị nếu hook của bạn không thực thi được. Hàm thực thi sẽ được gọi với một [execution object](#t). Bạn có thể sử dụng các xác nhận giá trị trong các hook của mình. Bạn cũng có thể truyền vào một [hàm macro](#test-macros) và các đối số bổ sung. -`.before()` hooks execute before `.beforeEach()` hooks. `.afterEach()` hooks execute before `.after()` hooks. Within their category the hooks execute in the order they were defined. By default hooks execute concurrently, but you can use `test.serial` to ensure only that single hook is run at a time. Unlike with tests, serial hooks are *not* run before other hooks: +Các hook `.before()` thực thi trước các hook `.beforeEach()`. Các hook `.afterEach()` thực thi trước các hook `.after()`. Các hook sẽ thực thi theo thứ tự chúng được định nghĩa, nhưng bạn có thể dùng `test.serial` để đảm bảo rằng chỉ có một hook chạy ở một thời điểm. Không giống như test, các hook tuần tự *không* chạy trước các hook khác: ```js test.before(t => { - // This runs before all tests + // Lệnh ở đây sẽ chạy trước tất cả các test }); test.before(t => { - // This runs concurrently with the above + // Lệnh ở đây sẽ chạy đồng thời với lệnh bên trên }); test.serial.before(t => { - // This runs after the above + // Lệnh ở đây sẽ chạy sau lệnh ở trên }); test.serial.before(t => { - // This too runs after the above, and before tests + // Lệnh ở đây cũng vậy, sẽ chạy sau các lệnh ở trên, và trước các test }); test.after('cleanup', t => { - // This runs after all tests + // Lệnh ở đây chạy sau tất cả các test }); test.after.always('guaranteed cleanup', t => { - // This will always run, regardless of earlier failures + // Lệnh ở đây sẽ luôn chạy, bất kể các lỗi trước đó }); test.beforeEach(t => { - // This runs before each test + // Lệnh ở đây sẽ chạy trước mỗi test }); test.afterEach(t => { - // This runs after each test + // Lệnh ở đây sẽ chạy sau mỗi test }); test.afterEach.always(t => { - // This runs after each test and other test hooks, even if they failed + // Lệnh ở đây chạy sau mỗi test và các hook khác, ngay cả khi chúng thất bại }); test('title', t => { - // Regular test + // Test thông thường }); ``` -Hooks can be synchronous or asynchronous, just like tests. To make a hook asynchronous return a promise or observable, use an async function, or enable callback mode via `test.before.cb()`, `test.beforeEach.cb()` etc. +Hook có thể đồng bộ hoặc bất đồng bộ giống như test. Để làm cho một hook bất đồng bộ trả về một promise hoặc observable, sử dụng một hàm async, hoặc kích hoạt chế độ callback bằng `test.before.cb()`, `test.beforeEach.cb()` .v.v ```js test.before(async t => { @@ -633,9 +633,9 @@ test.afterEach.cb(t => { }); ``` -Keep in mind that the `.beforeEach()` and `.afterEach()` hooks run just before and after a test is run, and that by default tests run concurrently. This means each multiple `.beforeEach()` hooks may run concurrently. Using `test.serial.beforeEach()` does not change this. If you need to set up global state for each test (like spying on `console.log` [for example](https://github.com/avajs/ava/issues/560)), you'll need to make sure the tests themselves are [run serially](#running-tests-serially). +Hãy nhớ rằng các hook `.beforeEach()` à `.afterEach()` chạy ngay trước vào sau khi test được thực thi, và theo mặc định các test được chạy đồng thời. Điều này có nghĩa là mỗi hook `.beforeEach()` có thể chạy đồng thời. Sử dụng `test.serial.beforeEach()` không thay đổi điều này. Nếu bạn cần thiết lập trạng thái toàn cục cho mỗi test (Như theo dõi `console.log` [ví dụ](https://github.com/avajs/ava/issues/560)), bạn sẽ cần phải đảm bảo rằng bản thân các test phải [chạy theo từng kỳ](#thực-thi-các-test-theo-từng-kỳ). -Remember that AVA runs each test file in its own process. You may not have to clean up global state in a `.after()`-hook since that's only called right before the process exits. +Hãy nhớ rằng AVA chạy mỗi file test trong tiến trình của chính nó. Bạn có thể sẽ không cần phải dọn dẹp lại trạng thái toàn cục của test với hook `.after()` vì nó chỉ được gọi ngay khi tiến trình kết thúc. #### Test context From 611875575dfca113cd89d0cf51d841014f23361a Mon Sep 17 00:00:00 2001 From: Kyoz Date: Sat, 28 Jul 2018 19:52:56 +0700 Subject: [PATCH 4/7] Done translate for latest readme.md to vietnamese --- vi_VN/readme.md | 395 +++++++++++++++++++++++++++--------------------- 1 file changed, 220 insertions(+), 175 deletions(-) diff --git a/vi_VN/readme.md b/vi_VN/readme.md index afd90577..c79e2847 100644 --- a/vi_VN/readme.md +++ b/vi_VN/readme.md @@ -10,7 +10,7 @@ ___ [![Build Status: Linux](https://travis-ci.org/avajs/ava.svg?branch=master)](https://travis-ci.org/avajs/ava) [![Build status: Windows](https://ci.appveyor.com/api/projects/status/e7v91mu2m5x48ehx/branch/master?svg=true)](https://ci.appveyor.com/project/ava/ava/branch/master) [![Coverage Status](https://coveralls.io/repos/github/avajs/ava/badge.svg?branch=master)](https://coveralls.io/github/avajs/ava?branch=master) [![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/xojs/xo) [![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/ava) [![Mentioned in Awesome Node.js](https://awesome.re/mentioned-badge.svg)](https://github.com/sindresorhus/awesome-nodejs) -Mặc dù JavaScript là một ngôn ngữ đơn luồng, nhưng IO trong Node.js có thể thực thi song song do tính chất không đồng bộ của nó. AVA tận dụng lợi thế này để chạy các test của bạn một cách đồng thời, điều này đặc biệt có lợi cho việc thực thi các test IO cồng kềnh. Ngoài ra, các file test được chạy song song như các quy trình riêng biệt, cho bạn hiệu năng tốt hơn và một môi trường độc lập cho mỗi file test. [Chuyển](https://github.com/sindresorhus/pageres/commit/663be15acb3dd2eb0f71b1956ef28c2cd3fdeed0) từ Mocha sang AVA trong dự án Pageres đã giảm thời gian chạy test từ 31 xuống còn 11 giây. Việc có các test chạy đồng thời buộc bạn phải viết từng test nhỏ, chi tiết, có ý nghĩa và không phụ thuộc vào trạng thái toàn cục hoặc trạng thái của các test khác, đó là một điều tuyệt vời! +Mặc dù JavaScript là một ngôn ngữ đơn luồng, nhưng IO trong Node.js có thể thực thi song song do tính chất không đồng bộ của nó. AVA tận dụng lợi thế này để chạy các test của bạn một cách đồng thời, điều này đặc biệt có lợi cho việc thực thi các test IO cồng kềnh. Ngoài ra, các file test được chạy song song như các process riêng biệt, cho bạn hiệu năng tốt hơn và một môi trường độc lập cho mỗi file test. [Chuyển](https://github.com/sindresorhus/pageres/commit/663be15acb3dd2eb0f71b1956ef28c2cd3fdeed0) từ Mocha sang AVA trong dự án Pageres đã giảm thời gian chạy test từ 31 xuống còn 11 giây. Việc có các test chạy đồng thời buộc bạn phải viết từng test nhỏ, chi tiết, có ý nghĩa và không phụ thuộc vào trạng thái toàn cục hoặc trạng thái của các test khác, đó là một điều tuyệt vời! ![](https://github.com/avajs/ava/blob/master/media/mini-reporter.gif) @@ -155,8 +155,8 @@ $ ava --help Các tùy chọn --watch, -w Chạy lại test khi test và file test có sự thay đổi - --match, -m Chỉ chạy tets với các tiêu đề phù hợp (Có thể lặp lại) - --update-snapshots, -u Cập nhật snapshots + --match, -m Chỉ chạy test với các tiêu đề phù hợp (Có thể lặp lại) + --update-snapshots, -u Cập nhật các snapshot --fail-fast Dừng ngay khi test đầu tiên thất bại --timeout, -T Thiết lập thời gian timeout toàn cục --serial, -s Chạy các test theo từng kỳ @@ -172,15 +172,15 @@ $ ava --help ava test-*.js ava test - Khuôn mẫu mặc định khi không có tham số: + Pattern mặc định khi không có tham số: test.js test-*.js test/**/*.js **/__tests__/**/*.js **/*.test.js ``` *Lưu ý rằng CLI sẽ sử dụng cài đặt cục bộ của AVA khi có thể, ngay cả khi bạn chạy lệnh toàn cục.* -Các thư mục được đệ quy, tất cả các file có đuôi `*.js` sẽ được xem như là file test. Các thư mục có tên `fixtures`, `helpers` và `node_modules` sẽ *luôn* bị bỏ qua. Các file có tên bắt đầu bằng `_` sẽ cho phép bạn đặt những code hữu ích trong cùng thư mục với file test của bạn. +Các thư mục được đệ quy, tất cả các file có đuôi `*.js` sẽ được xem như là file test. Các thư mục có tên `fixtures`, `helpers` và `node_modules` sẽ *luôn* bị bỏ qua. Các file có tên bắt đầu bằng `_` sẽ cho phép bạn đặt những helper code trong cùng thư mục với file test của bạn. -Khi sử dụng lệnh `npm test`, bạn có thể truyền vào trực tiếp các tham số để chỉ rõ file cần test `npm test test2.js`, nhưng các tham số nên được truyền vào như thế như sau `npm test -- --verbose`. +Khi sử dụng lệnh `npm test`, bạn có thể truyền vào trực tiếp các tham số để chỉ rõ file cần test `npm test test2.js`, nhưng các tham số nên được truyền vào như sau `npm test -- --verbose`. ## Kiểm lỗi @@ -339,9 +339,9 @@ Lưu ý rằng cấu hình cuối cùng không được là một promise. ## Tài liệu -Các test được thực hiện đồng thời. Bạn có thể chỉ định các test chạy đồng bộ và không động bộ. Các test được con là đồng bộ, trừ khi bạn trả về một Promise hoặc [observable](https://github.com/zenparsing/zen-observable). +Các test được thực hiện đồng thời. Bạn có thể chỉ định các test chạy đồng bộ và không động bộ. Các test được coi là đồng bộ, trừ khi bạn trả về một Promise hoặc [observable](https://github.com/zenparsing/zen-observable). -Chúng tôi *khuyến khích* sử dụng [async-functions](#hỗ-trợ-async-function). Chúng giúp cho code không đồng bộ súc tích và có thể đọc được, và chúng cũng ngầm trả về một promise thay bạn. +Chúng tôi *khuyến khích* sử dụng [async-functions](#hỗ-trợ-async-function). Chúng giúp cho code không đồng bộ súc tích hơn và có thể đọc được, và chúng cũng ngầm trả về một promise thay bạn. Nếu bạn không thể sử dụng promises hay observables, bạn nên kích hoạt "callback mode" bằng cách định nghĩa các test của mình với `test.cb([title], fn)`. Các test được khai bao theo cách này **phải** được kết thúc một cách thủ công với `t.end()`. Chế độ này chủ yếu được dùng để test các callback-style APIs. Tuy nhiên, chúng tôi đặc biệt khuyến khích bạn dùng [promisifying](https://github.com/sindresorhus/pify) callback-style APIs thay vì sử dụng "callback mode", vì nó giúp test chạy chính xác và dễ đọc hơn. @@ -351,9 +351,9 @@ AVA sẽ cố gắng chạy các file test với thư mục làm việc hiện t ### Tạo các test -Để tạo một test bạn phải gọi hàm `test` bạn đã import vào từ AVA. Cung cấp tiêu đề yêu cầu và hàm chức năng cho nó. Hàm chức năng sẽ được gọi khi bạn chạy test của mình. Nó sẽ truyền vào [execution object](#t) là đối số đầu tiên của nó. +Để tạo một test bạn phải gọi hàm `test` bạn đã import vào từ AVA. Cung cấp tiêu đề và hàm thực thi bắt buộc cho nó. Hàm thực thi sẽ được gọi khi bạn chạy test của mình. Nó sẽ truyền vào [execution object](#t) là đối số đầu tiên của nó. -**Lưu ý:** Để [các thông báo xác nhận nâng cao](#thông-báo-xác-nhận-nâng-cao) hoạt động chính xác, đối số đầu tiên **phải** được đặt tên là `t`. +**Lưu ý:** Để [các thông báo xác nhận giá trị nâng cao](#thông-báo-xác nhận-giá-trị-nâng-cao) hoạt động chính xác, đối số đầu tiên **phải** được đặt tên là `t`. ```js import test from 'ava'; @@ -363,13 +363,13 @@ test('my passing test', t => { }); ``` -### Lập kế hoạch xác nhận +### Lập kế hoạch xác nhận giá trị -Các kế hoạch xác nhận phải đảm bảo rằng các test chỉ thành công khi một một số nhất định các kiểm thử giá trị đã được thực thi. Chúng sẽ giúp bạn nắm bắt các trường hợp test kết thúc quá sớm. Chúng cũng sẽ làm cho test thất bại nếu có quá nhiều kiểm thử giá trị được thực thi, điều này sẽ hữu ích nếu bạn có các xác nhận bên trong các callback hoặc các vòng lặp. +Các kế hoạch xác nhận giá trị phải đảm bảo rằng các test chỉ thành công khi một một số nhất định các kiểm thử giá trị đã được thực thi. Chúng sẽ giúp bạn nắm bắt các trường hợp test kết thúc quá sớm. Chúng cũng sẽ làm cho test thất bại nếu có quá nhiều kiểm thử giá trị được thực thi, điều này sẽ hữu ích nếu bạn có các xác nhận giá trị bên trong các callback hoặc các vòng lặp. -Nếu bạn không chỉ định rõ ràng một kế hoạch xác nhận, test của bạn vẫn sẽ thất bại nếu không có bất cứ xác nhận nào được thực thi. Thiết lập tùy chọn `failWithoutAssertions` thành `false` trong AVA's [Cấu hình `package.json`](#cấu-hình) để vô hiệu hóa hành vi này. +Nếu bạn không chỉ định rõ ràng một kế hoạch xác nhận giá trị, test của bạn vẫn sẽ thất bại nếu không có bất cứ xác nhận giá trị nào được thực thi. Thiết lập tùy chọn `failWithoutAssertions` thành `false` trong AVA's [Cấu hình `package.json`](#cấu-hình) để vô hiệu hóa hành vi này. -Lưu ý rằng, không giống như [`tap`](https://www.npmjs.com/package/tap) và [`tape`](https://www.npmjs.com/package/tape), AVA *không* tự động kết thúc một test khi đã đạt được số kế hoạch xác nhận dự kiến. +Lưu ý rằng, không giống như [`tap`](https://www.npmjs.com/package/tap) và [`tape`](https://www.npmjs.com/package/tape), AVA *không* tự động kết thúc một test khi đã đạt được số kế hoạch xác nhận giá trị dự kiến. Các ví dụ sau đây sẽ có kết quả là một test đã thành công: @@ -412,9 +412,9 @@ test('invokes callback synchronously', t => { }); // Thất bại, test kết thúc một cách đồng bộ trước khi kiểm thử được thực thi ``` -### Thực thi các test theo từng kỳ +### Thực thi các test theo thứ tự -Theo mặc định, các test được chạy đồng thời, tuy nhiên, đôi khi bạn phải viết các test không thể chạy đồng thời. Trong các trường hợp hiếm hoi này, bạn có thể dùng `.serial`. Nó sẽ ép buộc các bài kiểm tra đó chạy ngay lập tức *trước* các test chạy đồng thời. +Theo mặc định, các test được chạy đồng thời, tuy nhiên, đôi khi bạn phải viết các test không thể chạy đồng thời. Trong các trường hợp hiếm hoi này, bạn có thể dùng `.serial`. Nó sẽ ép buộc các xác nhận giá trị đó chạy ngay lập tức, *trước* các test chạy đồng thời. ```js test.serial('passes serially', t => { @@ -446,45 +446,45 @@ Bạn có thể sử dụng `.only` với tất cả các test. Nó không thể ### Thực thi test với các tiêu đề trùng khớp -Tham số `--match` cho phép bạn chạy các test có tiêu đề trùng khớp, Điều này có thể thực hiện bằng cách sử dụng một wildcard patterns đơn giản. Các patterns không phân biệt chữ hoa thường. Xem [`matcher`](https://github.com/sindresorhus/matcher) để có thêm thông tin. +Tham số `--match` cho phép bạn chạy các test có tiêu đề trùng khớp, Điều này có thể thực hiện bằng cách sử dụng một wildcard patterns đơn giản. Các pattern không phân biệt chữ hoa thường. Xem [`matcher`](https://github.com/sindresorhus/matcher) để có thêm thông tin. -Các tiêu đề trùng khớp kết thúc với `foo`: +Các tiêu đề kết thúc với `foo`: ```console $ ava --match='*foo' ``` -Các tiêu đề trùng khớp bắt đầu với `foo`: +Các tiêu đề bắt đầu với `foo`: ```console $ ava --match='foo*' ``` -Các tiêu đề trùng khớp có chứa `foo`: +Các tiêu đề có chứa `foo`: ```console $ ava --match='*foo*' ``` -Các tiêu đề trùng khớp là `foo` (mặc dù không phân biệt chữ hoa thường): +Các tiêu đề là `foo` (mặc dù không phân biệt chữ hoa thường): ```console $ ava --match='foo' ``` -Các tiêu đề trùng khớp không có chứa `foo`: +Các tiêu đề không có chứa `foo`: ```console $ ava --match='!*foo*' ``` -Các tiêu đề trùng khớp bắt đầu với `foo` và kết thúc với `bar`: +Các tiêu đề bắt đầu với `foo` và kết thúc với `bar`: ```console $ ava --match='foo*bar' ``` -Các tiêu đề trùng khớp bắt đầu với `foo` hoặc kết thúc với `bar`: +Các tiêu đề bắt đầu với `foo` hoặc kết thúc với `bar`: ```console $ ava --match='foo*' --match='*bar' @@ -520,7 +520,7 @@ test(function foo(t) { ### Bỏ qua test -Đôi khi việc kiểm tra thất bại khó thể khó khắc phục. Bạn có thể yêu cầu AVA bỏ qua các test này bằng cách sử dụng `.skip`. Chúng sẽ vẫn được hiển thị trong output (là đã bị bỏ qua) nhưng không bao giờ thực thi. +Đôi khi việc xác nhận giá trị thất bại khó thể khó khắc phục. Bạn có thể yêu cầu AVA bỏ qua các test này bằng cách sử dụng `.skip`. Chúng sẽ vẫn được hiển thị trong output (là đã bị bỏ qua) nhưng không bao giờ thực thi. ```js test.skip('will not be run', t => { @@ -565,7 +565,7 @@ AVA cho phép bạn đăng ký các hook được chạy trước vào sau test. `test.beforeEach()` đăng ký một hook sẽ chạy trước mỗi test trong file test của bạn. Tương tự `test.afterEach()` sẽ đăng ký một hook sẽ chạy sau mỗi test. Sử dụng `test.afterEach.always()` để đăng ký một hook sẽ được gọi ngay cả khi các hook hoặc bản thân test đó thất bại. -Nếu một test bị bỏ qua với `.skip`, các hook `.beforeEach()`, `.afterEach()` và `.afterEach.always()` sẽ không được thực thi. Tương tự vậy, nếu tất cả test trong một file bị bỏ qua thì các hook `.before()`, `.after()` và `.after.always()` sẽ không được thực thi. +Nếu một test bị bỏ qua với `.skip`, các hook `.beforeEach()`, `.afterEach()` và `.afterEach.always()` sẽ không được thực thi. Tương tự như vậy, nếu tất cả test trong một file bị bỏ qua thì các hook `.before()`, `.after()` và `.after.always()` sẽ không được thực thi. Giống như `test()`, các phương thức này nhận vào một tiêu đề và một hàm thực thi. Tiêu đề sẽ được hiển thị nếu hook của bạn không thực thi được. Hàm thực thi sẽ được gọi với một [execution object](#t). Bạn có thể sử dụng các xác nhận giá trị trong các hook của mình. Bạn cũng có thể truyền vào một [hàm macro](#test-macros) và các đối số bổ sung. @@ -633,13 +633,13 @@ test.afterEach.cb(t => { }); ``` -Hãy nhớ rằng các hook `.beforeEach()` à `.afterEach()` chạy ngay trước vào sau khi test được thực thi, và theo mặc định các test được chạy đồng thời. Điều này có nghĩa là mỗi hook `.beforeEach()` có thể chạy đồng thời. Sử dụng `test.serial.beforeEach()` không thay đổi điều này. Nếu bạn cần thiết lập trạng thái toàn cục cho mỗi test (Như theo dõi `console.log` [ví dụ](https://github.com/avajs/ava/issues/560)), bạn sẽ cần phải đảm bảo rằng bản thân các test phải [chạy theo từng kỳ](#thực-thi-các-test-theo-từng-kỳ). +Hãy nhớ rằng các hook `.beforeEach()` và `.afterEach()` chạy ngay trước vào sau khi test được thực thi, và theo mặc định các test được chạy đồng thời. Điều này có nghĩa là mỗi hook `.beforeEach()` có thể chạy đồng thời. Sử dụng `test.serial.beforeEach()` không thay đổi điều này. Nếu bạn cần thiết lập trạng thái toàn cục cho mỗi test (Như theo dõi `console.log` [ví dụ](https://github.com/avajs/ava/issues/560)), bạn sẽ cần phải đảm bảo rằng bản thân các test phải [chạy theo từng kỳ](#thực-thi-các-test-theo-từng-kỳ). -Hãy nhớ rằng AVA chạy mỗi file test trong tiến trình của chính nó. Bạn có thể sẽ không cần phải dọn dẹp lại trạng thái toàn cục của test với hook `.after()` vì nó chỉ được gọi ngay khi tiến trình kết thúc. +Hãy nhớ rằng AVA chạy mỗi file test trong process của chính nó. Bạn có thể sẽ không cần phải dọn dẹp lại trạng thái toàn cục của test với hook `.after()` vì nó chỉ được gọi ngay khi process kết thúc. -#### Test context +#### Test theo ngữ cảnh -Hooks can share context with the test: +Các hook có thể chia sẻ ngữ cảnh với test: ```js test.beforeEach(t => { @@ -651,11 +651,11 @@ test('context data is foo', t => { }); ``` -Context created in `.before()` hooks is [cloned](https://www.npmjs.com/package/lodash.clone) before it is passed to `.beforeEach()` hooks and / or tests. The `.after()` and `.after.always()` hooks receive the original context value. +Ngữ cảnh được tạo ra bằng hook `.before()` được [cloned](https://www.npmjs.com/package/lodash.clone) trước khi nó được chuyển tới các hook `.beforeEach()` và / hoặc các test. Các hook `.after()` và `.after.always()` sẽ nhận được giá trị ngữ cảnh ban đầu. -For `.beforeEach()`, `.afterEach()` and `.afterEach.always()` hooks the context is *not* shared between different tests, allowing you to set up data such that it will not leak to other tests. +Đối với các hook `.beforeEach()`, `.afterEach()` và `.afterEach.always()` thì ngữ cảnh sẽ *không* được chia sẻ giữa các test với nhau, giúp dữ liệu mà bạn thiết lập sẽ không bị rò rĩ giữa các test với nhau. -By default `t.context` is an object but you can reassign it: +Theo mặc định `t.context` là một object, nhưng bạn có thể gán lại nó: ```js test.before(t => { @@ -669,7 +669,7 @@ test('context is unicorn', t => { ### Test macros -Additional arguments passed to the test declaration will be passed to the test implementation. This is useful for creating reusable test macros. +Các đối số được truyền vào định nghĩa của test sẽ được chuyển vào test. Điều này rất hữu ích để tạo ra các test macro. ```js function macro(t, input, expected) { @@ -680,7 +680,7 @@ test('2 + 2 = 4', macro, '2 + 2', 4); test('2 * 3 = 6', macro, '2 * 3', 6); ``` -You can build the test title programmatically by attaching a `title` function to the macro: +Bạn có thể xây dựng tiêu đề của test bằng cách lập trình gắn một `tiêu đề` của hàm vào macro ```js function macro(t, input, expected) { @@ -694,9 +694,9 @@ test(macro, '2 * 3', 6); test('providedTitle', macro, '3 * 3', 9); ``` -The `providedTitle` argument defaults to an empty string if the user does not supply a string title. This allows for easy concatenation without having to worry about `null` / `undefined`. It is worth remembering that the empty string is considered a falsy value, so you can still use `if(providedTitle) {...}`. +Đối số `providedTitle` theo mặc định sẽ là một chuỗi rỗng nếu người dùng không cung cấp một tiêu đề dạng chuỗi. Điều này cho phép chúng ta dễ dàng có được sự liên kết mà không cần phải lo lắng về `null` / `undefined`. Điều đáng để ghi nhớ là một chuỗi rỗng sẽ được coi là một giá trị sai, vì vậy bạn vẫn có thể dùng `if(providedTitle) {...}`. -You can also pass arrays of macro functions: +Bạn cũng có thể truyền vào các chuỗi là các hàm macro: ```js const safeEval = require('safe-eval'); @@ -713,15 +713,15 @@ test([evalMacro, safeEvalMacro], '2 + 2', 4); test([evalMacro, safeEvalMacro], '2 * 3', 6); ``` -We encourage you to use macros instead of building your own test generators ([here is an example](https://github.com/avajs/ava-codemods/blob/47073b5b58aa6f3fb24f98757be5d3f56218d160/test/ok-to-truthy.js#L7-L9) of code that should be replaced with a macro). Macros are designed to perform static analysis of your code, which can lead to better performance, IDE integration, and linter rules. +Chúng tôi khuyến khích bạn sử dụng macro thay vì xây dựng các test generator của riêng bạn ([đây là ví dụ](https://github.com/avajs/ava-codemods/blob/47073b5b58aa6f3fb24f98757be5d3f56218d160/test/ok-to-truthy.js#L7-L9) của một đoạn code nên thay bằng macro). Các macro được thiết kế để thực hiện việc phân tích code của bạn, nên nó có thể đem lại hiệu suất tốt hơn, tích hợp với IDE, và các quy tắc linter. -### Custom assertions +### Xác nhận giá trị tùy chọn -You can use any assertion library instead of or in addition to the built-in one, provided it throws exceptions when the assertion fails. +Bạn có thể sử dụng bất kì thư việc xác nhận giá trị (assertion) hoặc thư việc được tích hợp sẵn, miễn là nó throw các ngoại lệ khi xác nhận giá trị thất bại. -This won't give you as nice an experience as you'd get with the [built-in assertions](#assertions) though, and you won't be able to use the [assertion planning](#assertion-planning) ([see #25](https://github.com/avajs/ava/issues/25)). +Điều này sẽ không mang lại cho bạn một trải nghiệm tốt so với việc sử dụng thư viện [xác nhận giá trị được tích hợp sẵn](#xác-nhận-giá-trị), và bạn sẽ không thể sử dụng [lập kế hoạch xác nhận giá trị](#lập-kế-hoạch-xác-nhận-giá-trị) ([xem #25](https://github.com/avajs/ava/issues/25)). -You'll have to configure AVA to not fail tests if no assertions are executed, because AVA can't tell if custom assertions pass. Set the `failWithoutAssertions` option to `false` in AVA's [`package.json` configuration](#configuration). +Bạn sẽ cần phải cấu hình AVA để nó không đánh giá các test là thất bại nếu không có xác nhận giá trị nào được thực thi, bởi vì AVA không thể xác định liệu xác nhận giá trị tùy chọn có thành công hay không. Hãy đặt tùy chọn `failWithoutAssertions` thành `false` trong [cấu hình `package.json`](#cấu-hình) của AVA. ```js import assert from 'assert'; @@ -731,33 +731,33 @@ test('custom assertion', t => { }); ``` -### Latest JavaScript support +### Hỗ trợ JavaScript mới nhất -AVA uses [Babel 7](https://babeljs.io) so you can use the latest JavaScript syntax in your tests. There is no extra setup required. You don't need to be using Babel in your own project for this to work either. +AVA sử dụng [Babel 7](https://babeljs.io) vì vậy bạn có thể sử dụng các cú pháp JavaScript mới nhất trong test của mình. Không cần phải cấu hình gì thêm cả. Bạn cũng không cần phải sử dụng Babel trong dự án của mình. -We aim support all [finished syntax proposals](https://github.com/tc39/proposals/blob/master/finished-proposals.md), as well as all syntax from ratified JavaScript versions (e.g. ES2017). See our [`@ava/stage-4`](https://github.com/avajs/babel-preset-stage-4) preset for the currently supported proposals. +Chúng tôi nhắm đến mục đích là sẽ hỗ trợ [finished syntax proposals](https://github.com/tc39/proposals/blob/master/finished-proposals.md), cũng như tất cả các cú pháp từ các phiên bản JavaScript khác nhau đã được phê duyệt (Ví dụ ES2017). Xem [`@ava/stage-4`](https://github.com/avajs/babel-preset-stage-4) được đặt trước cho các proposals được hỗ trợ. -Please note that we do not add or modify built-ins. For example, if you use [`Object.entries()`](https://github.com/tc39/proposal-object-values-entries) in your tests, they will crash in Node.js 6 which does not implement this method. +Xin hãy lưu ý rằng chúng tôi không thêm hoặc sửa đổi các bản được tích hợp sẵn. Ví dụ, nếu bạn dùng [`Object.entries()`](https://github.com/tc39/proposal-object-values-entries) trong các test của bạn, chúng sẽ bị lỗi trong Node.js 6, vì nó không bao gồm phương thức này. -You can disable this syntax support, or otherwise customize AVA's Babel pipeline. See our [Babel recipe] for more details. +Bạn có thể vô hiệu hóa hỗ trợ cú pháp, hoặc tùy chỉnh Babel pipiline của AVA. Xem [Công thức Babel] để biết thêm chi tiết. -### TypeScript support +### Hỗ trợ TypeScript -AVA includes typings for TypeScript. You have to set up transpilation yourself. When you set `module` to `commonjs` in your `tsconfig.json` file, TypeScript will automatically find the type definitions for AVA. You should set `target` to `es2015` to use promises and async functions. +AVA cũng hỗ trợ TypeScript. Bạn cần phải tự mình thiết lập transpilation. Khi bạn đặt `module` thành `commonjs` trong tệp `tsconfig.json` của bạn, TypeScript sẽ tự động tìm các định nghĩa type cho AVA. Bạn nên đặt `target` thành `es2015` để sử dụng promises và async functions. -See AVA's [TypeScript recipe](docs/recipes/typescript.md) for a more detailed explanation. +Xem [Công thức TypeScript](docs/recipes/typescript.md) để có các giải thích chi tiết. -### Transpiling imported modules +### Transpile các module được import -AVA currently only transpiles the tests you ask it to run, as well as test helpers (files starting with `_` or in `helpers` directory) inside the test directory. *It will not transpile modules you `import` from outside of the test.* This may be unexpected but there are workarounds. +Hiện tại AVA chỉ transpile các test mà bạn yêu cầu chúng chạy, cũng như các test helper (file bắt đầu với `_` trong thư mục `helpers`) nằm trong thư mục test của bạn. *AVA sẽ không transpile các module bạn `import` từ bên ngoài test`.* Đây có thể là điều bạn không mong đợi nhưng chúng ta có vài cách để giải quyết. -If you use Babel you can use its [require hook](https://babeljs.io/docs/usage/require/) to transpile imported modules on-the-fly. To add it, [configure it in your `package.json`](#configuration). +Nếu bạn dùng Babel, bạn có thể sử dụng [require hook](https://babeljs.io/docs/usage/require/) của nó để chuyển đổi các module được import trực tiếp. Thể thêm nó, [Cài đặt nó vào `package.json`](#cài-đặt) của bạn -You can also transpile your modules in a separate process and refer to the transpiled files rather than the sources from your tests. Example [here](docs/recipes/precompiling-with-webpack.md). +Bạn cũng có thể transpile các module của bạn trong một process và tham khảo các file đã transpile thay vì các sources từ test của bạn. Ví dụ [ở đây](docs/recipes/precompiling-with-webpack.md). -### Promise support +### Hỗ trợ Promise -If you return a promise in the test you don't need to explicitly end the test as it will end when the promise resolves. +Nếu bạn trả về một promise trong test của bạn, bạn không cần phải kết thúc test của mình một cách rõ ràng bởi vì test sẽ kết thúc khi promise được resolve. ```js test('resolves with unicorn', t => { @@ -767,9 +767,9 @@ test('resolves with unicorn', t => { }); ``` -### Async function support +### Hỗ trợ async function -AVA comes with built-in support for [async functions](https://tc39.github.io/ecmascript-asyncawait/) *(async/await)*. +AVA đi kèm với hỗ trợ tích hợp cho [async functions](https://tc39.github.io/ecmascript-asyncawait/) *(async/await)*. ```js test(async function (t) { @@ -784,11 +784,11 @@ test('promises the truth', async t => { }); ``` -### Observable support +### Hỗ trợ Observable -AVA comes with built-in support for [observables](https://github.com/zenparsing/es-observable). If you return an observable from a test, AVA will automatically consume it to completion before ending the test. +AVA đi kèm với hỗ trợ tích hợp cho [observables](https://github.com/zenparsing/es-observable). Nếu bạn trả về một observable từ một test, AVA sẽ tự động hoàn tất trước khi test kết thúc. -*You do not need to use "callback mode" or call `t.end()`.* +*Bạn không cần phải dùng "callback mode" hoặc gọi `t.end()`.* ```js test('handles observables', t => { @@ -802,22 +802,22 @@ test('handles observables', t => { }); ``` -### Callback support +### Hỗ trợ callback -AVA supports using `t.end` as the final callback when using node-style error-first callback APIs. AVA will consider any truthy value passed as the first argument to `t.end` to be an error. Note that `t.end` requires "callback mode", which can be enabled by using the `test.cb` chain. +AVA hỗ trợ sử dụng `t.end` như là final callback khi sử dụng node-style error-first callback APIs. AVA sẽ xem xét bất kì giá trị nào được truyền vào như là một đối số đầu tiên của `t.end` để nó trở thành một lỗi. Lưu ý rằng `t.end` cần "callback mode", thứ có thể được kích hoạt bằng cách dùng chuỗi `test.cb`. ```js test.cb('data.txt can be read', t => { - // `t.end` automatically checks for error as first argument + // `t.end` tự động xác nhận lỗi như là đối số đầu tiên fs.readFile('data.txt', t.end); }); ``` -### Global timeout +### Timeout toàn cục -A global timeout can be set via the `--timeout` option. Timeout in AVA behaves differently than in other test frameworks. AVA resets a timer after each test, forcing tests to quit if no new test results were received within the specified timeout. This can be used to handle stalled tests. +Một timeout toàn cục có thể được đặt thông qua tùy chọn `--timeout`. Timeout trong AVA hoạt động khác với timeout trong các frameworks khác. AVA đặt lại một timer sau mỗi test, buộc test phải thoát nếu không có các kết quả của test mới nhận được trong thời gian timeout đã chỉ định. Điều này có thể được dùng để xử lý các test bị trì hoãn. -You can set timeouts in a human-readable way: +Bạn có thể đặt timeout theo cách: ```console $ ava --timeout=10s # 10 seconds @@ -825,9 +825,9 @@ $ ava --timeout=2m # 2 minutes $ ava --timeout=100 # 100 milliseconds ``` -### Parallel runs in CI +### Chạy song song trong CI -AVA automatically detects whether your CI environment supports parallel builds. Each build will run a subset of all test files, while still making sure all tests get executed. See the [`ci-parallel-vars`](https://www.npmjs.com/package/ci-parallel-vars) package for a list of supported CI environments. +AVA tự động phát hiện xem môi trường CI của bạn có hỗ trợ build song song hay không. Mỗi build sẽ chạy một tập con của tất cả các file test, trong khi vẫn đảm bảo tất cả các test được thực thi. Xem [`ci-parallel-vars`](https://www.npmjs.com/package/ci-parallel-vars) để biết danh sách các môi trường CI được hỗ trợ. ## API @@ -847,43 +847,43 @@ AVA automatically detects whether your CI environment supports parallel builds. Type: `string` -Test title. +Tiêu đề của test. #### `implementation(t)` Type: `function` -Should contain the actual test. +Nên chứa một test thực tế. ##### `t` Type: `object` -The execution object of a particular test. Each test implementation receives a different object. Contains the [assertions](#assertions) as well as `.plan(count)` and `.end()` methods. `t.context` can contain shared state from hooks. `t.title` returns the test's title. +Đối tượng thực thi của một test cụ thể. Mỗi test nhận một đối tượng khác nhau. Chứa các [Xác nhận giá trị](#xác-nhận-giá-trị) cũng như các phương thức `.plan(count)` và `.end()`. `t.context()` có thể chứa trạng thái được chia sẻ từ các hook. `t.title` trả về tiêu đề của test. ###### `t.plan(count)` -Plan how many assertion there are in the test. The test will fail if the actual assertion count doesn't match the number of planned assertions. See [assertion planning](#assertion-planning). +Lên kế hoạch xem bao nhiêu xác nhận giá trị có trong test. Test sẽ thất bại nếu số lần xác nhận giá trị thực tế không trùng khớp với số lần xác nhận giá trị đã lên kế hoạch. Xem [Lập kế hoạch xác nhận giá trị](#lập-kế-hoạch-xác-nhận-giá-trị). ###### `t.end()` -End the test. Only works with `test.cb()`. +Kết thúc test. Chỉ hoạt động với `test.cb()`. ###### `t.log(...values)` -Log values contextually alongside the test result instead of immediately printing them to `stdout`. Behaves somewhat like `console.log`, but without support for placeholder tokens. +Hiển thị các giá trị theo từng ngữ cảnh bên cạnh kết quả test thay vì ngay lập tức in chúng vào `stdout`. Hoạt động giống như `console.log`, nhưng không hỡ trợ placeholder tokens. -## Assertions +## Xác nhận giá trị -Assertions are mixed into the [execution object](#t) provided to each test implementation: +Xác nhận giá trị được pha trộn vào [execution object](#t) được cung cấp cho mỗi lần thực hiện test: ```js test('unicorns are truthy', t => { - t.truthy('unicorn'); // Assertion + t.truthy('unicorn'); // Xác nhận giá trị }); ``` -Assertions are bound to their test so you can assign them to a variable or pass them around: +Các xác nhận giá trị được ràng buộc với test vì vậy bạn có thể gán chúng cho một biến hoặc chuyển chúng đi xung quanh: ```js test('unicorns are truthy', t => { @@ -892,7 +892,7 @@ test('unicorns are truthy', t => { }); ``` -Assertions can be skipped by adding `.skip()`: +Xác nhận giá trị có thể được bỏ qua bằng cách thêm `.skip()`: ```js test('unicorns are truthy', t => { @@ -900,65 +900,97 @@ test('unicorns are truthy', t => { }); ``` -If multiple assertion failures are encountered within a single test, AVA will only display the *first* one. +Nếu gặp phải nhiều lỗi xác nhận giá trị trong một test, AVA sẽ chỉ hiển thị lỗi *đầu tiên*. ### `.pass([message])` -Passing assertion. +Vượt qua xác nhận giá trị. ### `.fail([message])` -Failing assertion. +Làm xác nhận giá trị thất bại. ### `.truthy(value, [message])` -Assert that `value` is truthy. +Xác nhận rằng `value` là đúng đắn. ### `.falsy(value, [message])` -Assert that `value` is falsy. +Xác nhận rằng `value` là không đúng đắn. ### `.true(value, [message])` -Assert that `value` is `true`. +Xác nhận rằng `value` là `true`. ### `.false(value, [message])` -Assert that `value` is `false`. +Xác nhận rằng `value` là `false`. ### `.is(value, expected, [message])` -Assert that `value` is the same as `expected`. This is based on [`Object.is()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). +Xác nhận rằng `value` là tương tự so với `expected`. Điều này dựa trên [`Object.is()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). ### `.not(value, expected, [message])` -Assert that `value` is not the same as `expected`. This is based on [`Object.is()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). +Xác nhận rằng `value` là không tương tự như `expected`. Điều này dựa trên [`Object.is()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). ### `.deepEqual(value, expected, [message])` -Assert that `value` is deeply equal to `expected`. See [Concordance](https://github.com/concordancejs/concordance) for details. Works with [React elements and `react-test-renderer`](https://github.com/concordancejs/react). +Xác nhận rằng `value` là bằng chính xác (deeply equal) so với `expected`. Xem [Concordance](https://github.com/concordancejs/concordance) để biết thêm chi tiết. Hoạt động với [React elements and `react-test-renderer`](https://github.com/concordancejs/react). ### `.notDeepEqual(value, expected, [message])` -Assert that `value` is not deeply equal to `expected`. The inverse of `.deepEqual()`. +Xác nhận rằng `value` là không bằng chính xác so với `expected`. Ngược lại với `.deepEqual()`. -### `.throws(thrower, [expected, [message]])` +### `.throws(fn, [expected, [message]])` -Assert that an error is thrown. `thrower` can be a function which should throw, or return a promise that should reject. Alternatively a promise can be passed directly. +Xác nhận rằng một lỗi đã được throw. `fn` phải là một hàm mà có throw lỗi. giá trị được throw *phải* là một lỗi. Nó được return do vậy bạn có thể chạy nhiều xác nhận giá trị hơn với nó. -The thrown value *must* be an error. It is returned so you can run more assertions against it. +Giá trị được throw *phải* là một lỗi. Nó được trả về để bạn có thể chạy nhiều xác nhận giá trị hơn. -`expected` can be a constructor, in which case the thrown error must be an instance of the constructor. It can be a string, which is compared against the thrown error's message, or a regular expression which is matched against this message. You can also specify a matcher object with one or more of the following properties: +`expected` có thể là một constructor, trong trường hợp đó lỗi được throw ra phải là một instance của constructor. Nó có thể là một chuỗi, được so sánh với thông báo lỗi được throw ra, hoặc một regular expression được đối sánh với thông báo này. Bạn cũng có thể chỉ định đối tượng đối sánh có một hoặc nhiều thuộc tính sau. -* `instanceOf`: a constructor, the thrown error must be an instance of -* `is`: the thrown error must be strictly equal to `expected.is` -* `message`: either a string, which is compared against the thrown error's message, or a regular expression, which is matched against this message -* `name`: the expected `.name` value of the thrown error -* `code`: the expected `.code` value of the thrown error +* `instanceOf`: một constructor, lỗi được throw ra phải là một instance của +* `is`: lỗi được throw ra phải đúng bằng `expected.is` +* `message`: có thể là một chuỗi, được so sánh với thông báo lỗi được throw ra, hoặc một regular expression được đối sánh với thông báo này +* `name`: giá trị `.name` của một lỗi được throw ra +* `code`: giá trị `.code` của một lỗi được throw ra -`expected` does not need to be specified. If you don't need it but do want to set an assertion message you have to specify `null`. +`expected` không cần phải được chỉ định. Nếu bạn không cần nó nhưng muốn thiết lập một thông báo xác nhận giá trị, bạn phải chỉ rõ `null`. -Example: +Ví dụ: + +```js +const fn = () => { + throw new TypeError('🦄'); +}; + +test('throws', t => { + const error = t.throws(() => { + fn(); + }, TypeError); + + t.is(error.message, '🦄'); +}); +``` + +### `.throwsAsync(thrower, [expected, [message]]` + +Xác nhận rằng một lỗi đã được throw. thrower có thể là một hàm không đồng bộ mà có throw lỗi, hoặc một promise phải reject. Xác nhận giá trị này phải được chờ. + +Giá trị được throw *phải* là một lỗi. Nó được trả về để bạn có thể chạy nhiều xác nhận giá trị hơn. + +`expected` có thể là một constructor, trong trường hợp đó lỗi được throw ra phải là một instance của constructor. Nó có thể là một chuỗi, được so sánh với thông báo lỗi được throw ra, hoặc một regular expression được đối sánh với thông báo này. Bạn cũng có thể chỉ định đối tượng đối sánh có một hoặc nhiều thuộc tính sau. + +* `instanceOf`: một constructor, lỗi được throw ra phải là một instance của +* `is`: lỗi được throw ra phải đúng bằng `expected.is` +* `message`: có thể là một chuỗi, được so sánh với thông báo lỗi được throw ra, hoặc một regular expression được đối sánh với thông báo này +* `name`: giá trị `.name` của một lỗi được throw ra +* `code`: giá trị `.code` của một lỗi được throw ra + +`expected` không cần phải được chỉ định. Nếu bạn không cần nó nhưng muốn thiết lập một thông báo xác nhận giá trị, bạn phải chỉ rõ `null`. + +Ví dụ: ```js const fn = () => { @@ -983,7 +1015,7 @@ test('rejects', async t => { }); ``` -When testing a promise you must wait for the assertion to complete: +Khi test một promise, bạn phải chờ cho xác nhận giá trị được hoàn thành: ```js test('rejects', async t => { @@ -991,7 +1023,7 @@ test('rejects', async t => { }); ``` -When testing an asynchronous function you must also wait for the assertion to complete: +Khi test một hàm bất đồng bộ (asynchronous function) bạn cũng phải chờ cho xác nhận giá trị được hoàn thành: ```js test('throws', async t => { @@ -1003,9 +1035,9 @@ test('throws', async t => { ### `.notThrows(nonThrower, [message])` -Assert that no error is thrown. `thrower` can be a function which shouldn't throw, or return a promise that should resolve. Alternatively a promise can be passed directly. +Xác nhận rằng không có lỗi được throw ra. `thrower` có thể là một hàm mà không nên được throw ra, hoặc trả về một promise có thể resolve. Hoặc một promise có thể hoàn tất thành công test một cách trực tiếp. -Like the `.throws()` assertion, when testing a promise you must wait for the assertion to complete: +Giống như xác nhận `.throws()`, khi test một promise bạn phải chờ cho xác nhận giá trị được hoàn tất: ```js test('resolves', async t => { @@ -1013,34 +1045,47 @@ test('resolves', async t => { }); ``` +### `.notThrowsAsync(nonThrower, [message])` + +Xác nhận rằng không có lỗi được throw ra. `nonThrower` có thể là một hàm bất đồng bộ mà không nên throw lỗi, hoặc một promise cần phải resolve. + +Giống như `.throwsAsync()`, bạn phải chờ cho xác nhận giá trị hoàn thành: + +```js +test('resolves', async t => { + await t.notThrowsAsync(promise); +}); +``` + + ### `.regex(contents, regex, [message])` -Assert that `contents` matches `regex`. +Xác nhận rằng `contents` trùng khớp với `regex`. ### `.notRegex(contents, regex, [message])` -Assert that `contents` does not match `regex`. +Xác nhận rằng `contents` không trùng khớp với `regex`. ### `.snapshot(expected, [message])` ### `.snapshot(expected, [options], [message])` -Compares the `expected` value with a previously recorded snapshot. Snapshots are stored for each test, so ensure you give your tests unique titles. Alternatively pass an `options` object to select a specific snapshot, for instance `{id: 'my snapshot'}`. +So sánh giá trị `expected` với một snapshot đã được ghi lại trước đây. Các snapshot được lưu trữ cho mỗi test, vì vậy hãy đảm bảo bạn cho các test của mình những tiêu đề độc lập lẫn nhau. Ngoài ra, bạn có thể truyền một đối tượng `options` để chọn một snapshot cụ thể, ví dụ `{id: 'my snapshot'}`. -Snapshot assertions cannot be skipped when snapshots are being updated. +Không thể bỏ qua các xác nhận snapshot khi các snapshot đang được cập nhật. -## Snapshot testing +## Test với snapshot -AVA supports snapshot testing, [as introduced by Jest](https://facebook.github.io/jest/docs/snapshot-testing.html), through its [Assertions](#assertions) interface. You can snapshot any value as well as React elements: +AVA hỗ trợ test với snapshot, [như đã được giới thiệu bởi Jest](https://facebook.github.io/jest/docs/snapshot-testing.html), thông qua interface [Xác nhận giá trị](#xác-nhận-giá-trị). Bạn có thể ghi lại snapshot bất kì giá trị nào, cũng như các React element: ```js -// Your component +// Component của bạn const HelloWorld = () =>

Hello World...!

; export default HelloWorld; ``` ```js -// Your test +// Test của bạn import test from 'ava'; import render from 'react-test-renderer'; import HelloWorld from '.'; @@ -1051,28 +1096,28 @@ test('HelloWorld component', t => { }); ``` -[Try it out in this example project.](https://github.com/avajs/ava-snapshot-example) +[Hãy thử nó trong các project ví dụ mẫu này](https://github.com/avajs/ava-snapshot-example) -Snapshots are stored alongside your test files. If your tests are in a `test` or `tests` folder the snapshots will be stored in a `snapshots` folder. If your tests are in a `__tests__` folder then they they'll be stored in a `__snapshots__` folder. +Các snapshot được lưu trữ cùng với các file test. Nếu các test của bạn nằm trong thư mục `test` hoặc `tests`, các snapshot sẽ được lưu trữ trong thư mục `snapshot`. Nếu các test của bạn nằm trong thư mục `__tests__` thì các snapshot sẽ được lưu trữ trong thư mục `__snapshot__`. -Say you have `~/project/test/main.js` which contains snapshot assertions. AVA will create two files: +Giả sử bạn có `~/project/test/main.js` chứa các snapshot xác nhận giá trị. AVA sẽ tạo 2 file: * `~/project/test/snapshots/main.js.snap` * `~/project/test/snapshots/main.js.md` -The first file contains the actual snapshot and is required for future comparisons. The second file contains your *snapshot report*. It's regenerated when you update your snapshots. If you commit it to source control you can diff it to see the changes to your snapshot. +File đầu tiên chứa snapshot thực tế và cần cho các so sánh trong tương lai. File thứ hai chứa *báo cáo snapshot* của bạn. Chúng sẽ được tạo lại khi bạn cập nhật các snapshot của mình. Nếu bạn commit nó vào source của project, bạn có thể thấy được sự khác biệt của các thay đổi trong các snapshot của mình. -AVA will show why your snapshot assertion failed: +AVA sẽ hiển thị lý do tại sao xác nhận snapshot thất bại: -You can then check your code. If the change was intentional you can use the `--update-snapshots` (or `-u`) flag to update the snapshots: +Sau đó, bạn có thể kiểm tra code của mình, Nếu thay đổi là cố ý, bạn có thể dùng tham số `--update-snapshots` (hoặc `-u`) để cập nhật các snapshot: ```console $ ava --update-snapshots ``` -You can specify a fixed location for storing the snapshot files in AVA's [`package.json` configuration](#configuration): +Bạn có thể chỉ định một vị trí cố định để lưu các file snapshot trong [Cấu hình `package.json`](#cấu-hình) của AVA: ```json { @@ -1082,27 +1127,27 @@ You can specify a fixed location for storing the snapshot files in AVA's [`packa } ``` -The snapshot files will be saved in a directory structure that mirrors that of your test files. +Các file snapshot được lưu trong cấu trúc thư mục sẽ phản ánh các file test của bạn. -If you are running AVA against precompiled test files, AVA will try and use source maps to determine the location of the original files. Snapshots will be stored next to these files, following the same rules as if AVA had executed the original files directly. This is great if you're writing your tests in TypeScript (see our [TypeScript recipe](docs/recipes/typescript.md)). +Nếu bạn đang chạy AVA với các file test đã được compile trước, AVA sẽ cố thử và sử dụng source map để xác định vị trí của các file gốc. Snapshot sẽ được lưu bên cạnh các file này, tuân theo các quy tắc giống như khi AVA thực thi các file gốc một cách trực tiếp. Điều này rất tuyệt vời nếu bạn đang viết test của mình bằng TypeScript (Xem [Công thức TypeScript](docs/recipes/typescript.md) của chúng tôi). -### Skipping assertions +### Bỏ qua các xác nhận giá trị -Any assertion can be skipped using the `skip` modifier. Skipped assertions are still counted, so there is no need to change your planned assertion count. +Bất kì các xác nhận giá trị đều có thể được bỏ qua bằng cách dùng `skip`. Các xác nhận giá trị đã bị bỏ qua vẫn sẽ được đếm, vì vậy bạn không cần phải thay đổi kế hoạch đếm các xác nhận giá trị của mình. ```js test('skip assertion', t => { t.plan(2); - t.is.skip(foo(), 5); // No need to change your plan count when skipping + t.is.skip(foo(), 5); // Không cần phải thay đổi kế hoạch đếm các xác nhận giá trị khi bỏ qua t.is(1, 1); }); ``` -### Enhanced assertion messages +### Thông báo xác nhận giá trị nâng cao -AVA comes with [`power-assert`](https://github.com/power-assert-js/power-assert) built-in, giving you more descriptive assertion messages. It reads your test and tries to infer more information from the code. +AVA đi kèm với [`power-assert`](https://github.com/power-assert-js/power-assert) được tích hợp sẵn, cung cấp cho bạn nhiều thông báo xác nhận chi tiết tơn. Nó sẽ đọc test của bạn và cố suy ra nhiều thông tin hơn trong code. -Let's take this example, using Node's standard [`assert` library](https://nodejs.org/api/assert.html): +Hãy lấy ví dụ này, sử dụng Node's standard [`assert` library](https://nodejs.org/api/assert.html): ```js const a = /foo/; @@ -1111,13 +1156,13 @@ const c = 'baz'; require('assert').ok(a.test(b) || b === c); ``` -If you paste that into a Node REPL it'll return: +Nếu bạn dán nó vào Node REPL nó sẽ trả về: ``` AssertionError: false == true ``` -In AVA however, this test: +Tuy nhiên, trong AVA, test này: ```js test('enhanced assertions', t => { @@ -1128,7 +1173,7 @@ test('enhanced assertions', t => { }); ``` -Will output: +Sẽ trả về: ``` t.true(a.test(b) || b === c) @@ -1137,80 +1182,80 @@ t.true(a.test(b) || b === c) false ``` -## Process isolation +## Cách ly process -Each test file is run in a separate Node.js process. This allows you to change the global state or overriding a built-in in one test file, without affecting another. It's also great for performance on modern multi-core processors, allowing multiple test files to execute in parallel. +Mỗi file test sẽ được chạy trong một Node.js process riêng biệt. Điều này cho phép bạn thay đổi trạng thái toàn cục hoặc ghi đè lên một trạng thái được tích hợp sẵn trong file test, mà không làm ảnh hưởng các file test khác. Nó cũng đem lại hiệu suất tuyệt vời trên các bộ xử lý nhiều core hiện đại, giúp nhiều file test được thực thi song song với nhau. -AVA will set `process.env.NODE_ENV` to `test`, unless the `NODE_ENV` environment variable has been set. This is useful if the code you're testing has test defaults (for example when picking what database to connect to, or environment-specific Babel options). It may cause your code or its dependencies to behave differently though. Note that `'NODE_ENV' in process.env` will always be `true`. +AVA sẽ đặt `process.env.NODE_ENV` vào `test`, trừ khi biến môi trường `NODE_ENV` chưa được thiết lập. Điều này rất hữu ích nếu code mà bạn đang test có các mặc định của test (ví dụ như chọn database nào để connect, hoặc tùy chọn môi trường cụ thể của Babel). Dù nó sẽ làm cho code của bạn và các dependencies của nó hành xử khác nhau. Lưu ý rằng `NODE_ENV` trong process.env` sẽ luôn luôn là `true`. -## Tips +## Các mẹo -### Temp files +### Các file tạm thời -Running tests concurrently comes with some challenges, doing file IO is one. +Chạy các test đồng thời đem đến một số thách thức, làm file IO là một trường hợp. -Usually, serial tests create temp directories in the current test directory and clean them up at the end. This won't work when you run tests concurrently as tests will conflict with each other. The correct way to do it is to use a new temp directory for each test. The [`tempfile`](https://github.com/sindresorhus/tempfile) and [`temp-write`](https://github.com/sindresorhus/temp-write) modules can be helpful. +Thông thường, các test nối tiếp tạo ra các thư mục tạm thời trong thư mục test hiện tại, và sẽ dọn dẹp chúng khi test kết thúc. Điều này sẽ không hoạt động khi bạn chạy các test đồng thời, bởi vì các test sẽ xung đột với nhau. Cách chính xác để làm điều này là sử dụng một thư mục tạm mới cho mỗi test. Các module [`tempfile`](https://github.com/sindresorhus/tempfile) và [`temp-write`](https://github.com/sindresorhus/temp-write) có thể hữu ích với bạn. ### Code coverage -You can't use [`istanbul`](https://github.com/gotwarlost/istanbul) for code coverage as AVA [spawns the test files](#process-isolation). You can use [`nyc`](https://github.com/bcoe/nyc) instead, which is basically `istanbul` with support for subprocesses. +Bạn không thể dùng [`istanbul`](https://github.com/gotwarlost/istanbul) để kiểm tra code coverage như AVA [sinh ra các file test](#cách-ly-process). Thay vào đó bạn có thể dùng [`nyc`](https://github.com/bcoe/nyc), vì nyc về cơ bản là `istanbul` nhưng có sự hỗ trợ subprocess. -As of version `5.0.0` it uses source maps to report coverage for your actual code, regardless of transpilation. Make sure that the code you're testing includes an inline source map or references a source map file. If you use `babel-register` you can set the `sourceMaps` option in your Babel config to `inline`. +Kể từ phiên bản `5.0.0`, AVA sẽ sử dụng các source map để báo cáo coverage cho code của bạn, bất kể sự transpile. Hãy đảm bảo rằng code mà bạn đang test có bao gồm inline source map hơạc tham chiếu đến một file source map. Nếu bạn dùng `babel-register` bạn có thể đặt tùy chọn `sourceMaps` trong cấu hình Babel của bạn thành `inline`. -### Common pitfalls +### Những cạm bẫy phổ biến -We have a growing list of [common pitfalls](docs/common-pitfalls.md) you may experience while using AVA. If you encounter any issues you think are common, comment in [this issue](https://github.com/avajs/ava/issues/404). +Chúng tôi có một danh sách ngày càng tăng về [các cạm bẫy phổ biến](docs/common-pitfalls.md) mà bạn có thể gặp phải khi sử dụng AVA. Nếu bạn gặp phải bất kì vấn đề nào bạn nghĩ là phổ biến, hãy bình luận trong [issue này](https://github.com/avajs/ava/issues/404). ## FAQ -### Why not `mocha`, `tape`, `tap`? +### Tại sao không phải là `mocha`, `tape`, `tap`? -Mocha requires you to use implicit globals like `describe` and `it` with the default interface (which most people use). It's not very opinionated and executes tests serially without process isolation, making it slow. +Mocha yêu cầu bạn phải sử dụng các cấu hình toàn cục như `description` và `it` với interface mặc định (thứ mà hầu hết mọi người dùng). Điều đó không được đánh giá cao và việc thực thi các test theo thứ tự mà không cách ly process, sẽ làm cho test của bạn chạy chậm. -Tape and tap are pretty good. AVA is highly inspired by their syntax. They too execute tests serially. Their default [TAP](https://testanything.org) output isn't very user-friendly though so you always end up using an external tap reporter. +Tape và tap cũng khá là tốt. AVA được lấy cảm hứng từ cú pháp của chúng. Chúng cũng thực hiện các bài kiểm tra một cách tuần tự. Nhưng đầu ra mặc định [TAP](https://testanything.org) của chúng lại không thân thiện với người dùng, do vậy bạn luôn phải sử dụng các tap reporter khác. -In contrast AVA is highly opinionated and runs tests concurrently, with a separate process for each test file. Its default reporter is easy on the eyes and yet AVA still supports TAP output through a CLI flag. +Ngược lại, AVA được đánh giá cao và nó chạy các test một cách đồng thời, với một process độc lập cho mỗi file test. Reporter mặc định của AVA rất dễ đọc và không dừng lại ở đó AVA còn hỗ trợ TAP output thông qua tham số CLI. -### How is the name written and pronounced? +### Tên project được viết và đọc như thế nào? -AVA, not Ava or ava. Pronounced [/ˈeɪvə/ ay-və](media/pronunciation.m4a?raw=true). +AVA, chứ không phải Ava hay ava. Được phát âm là [/ˈeɪvə/ ay-və](media/pronunciation.m4a?raw=true). -### What is the header background? +### Hình nền của tiêu đề là gì vậy? -It's the [Andromeda galaxy](https://simple.wikipedia.org/wiki/Andromeda_galaxy). +Đó là [thiên hà Andromeda](https://simple.wikipedia.org/wiki/Andromeda_galaxy). -### What is the difference between concurrency and parallelism? +### Sự khác nhau giữa đồng thời và song song là gì? -[Concurrency is not parallelism. It enables parallelism.](https://stackoverflow.com/q/1050222) +[Đồng thời không phải là song song, nó cho phép song song.](https://stackoverflow.com/q/1050222) -## Recipes +## Các công thức -- [Test setup](docs/recipes/test-setup.md) +- [Cài đặt Test](docs/recipes/test-setup.md) - [Code coverage](docs/recipes/code-coverage.md) -- [Watch mode](docs/recipes/watch-mode.md) -- [Endpoint testing](docs/recipes/endpoint-testing.md) -- [When to use `t.plan()`](docs/recipes/when-to-use-plan.md) -- [Browser testing](docs/recipes/browser-testing.md) +- [Chế độ theo dõi](docs/recipes/watch-mode.md) +- [Kiểm tra endpoint](docs/recipes/endpoint-testing.md) +- [Khi nào nên dùng `t.plan()`](docs/recipes/when-to-use-plan.md) +- [Test browser](docs/recipes/browser-testing.md) - [TypeScript](docs/recipes/typescript.md) - [Flow](docs/recipes/flow.md) -- [Configuring Babel][Babel recipe] -- [Using ES modules](docs/recipes/es-modules.md) -- [Passing arguments to your test files](docs/recipes/passing-arguments-to-your-test-files.md) -- [Testing React components](docs/recipes/react.md) -- [Testing Vue.js components](docs/recipes/vue.md) -- [JSPM and SystemJS](docs/recipes/jspm-systemjs.md) -- [Debugging tests with Chrome DevTools](docs/recipes/debugging-with-chrome-devtools.md) -- [Debugging tests with WebStorm](docs/recipes/debugging-with-webstorm.md) -- [Precompiling source files with webpack](docs/recipes/precompiling-with-webpack.md) -- [Isolated MongoDB integration tests](docs/recipes/isolated-mongodb-integration-tests.md) - -## Support +- [Cấu hình Babel][Babel recipe] +- [Sử dụng các module ES](docs/recipes/es-modules.md) +- [Truyền tham số vào các file test của bạn](docs/recipes/passing-arguments-to-your-test-files.md) +- [Test cho React components](docs/recipes/react.md) +- [Test cho Vue.js components](docs/recipes/vue.md) +- [JSPM và SystemJS](docs/recipes/jspm-systemjs.md) +- [Debug các test với Chrome DevTools](docs/recipes/debugging-with-chrome-devtools.md) +- [Debug các test với WebStorm](docs/recipes/debugging-with-webstorm.md) +- [Compile trước các file source với webpack](docs/recipes/precompiling-with-webpack.md) +- [Cách lý các test tích hợp của MongoDB](docs/recipes/isolated-mongodb-integration-tests.md) + +## Hỗ trợ - [Stack Overflow](https://stackoverflow.com/questions/tagged/ava) - [Spectrum](https://spectrum.chat/ava) - [Twitter](https://twitter.com/ava__js) -## Related +## Có liên quan - [eslint-plugin-ava](https://github.com/avajs/eslint-plugin-ava) - Lint rules for AVA tests - [sublime-ava](https://github.com/avajs/sublime-ava) - Snippets for AVA tests @@ -1220,20 +1265,20 @@ It's the [Andromeda galaxy](https://simple.wikipedia.org/wiki/Andromeda_galaxy). - [grunt-ava](https://github.com/avajs/grunt-ava) - Run tests with grunt - [More…](https://github.com/avajs/awesome-ava#packages) -## Links +## Các liên kết - [AVA stickers, t-shirts, etc](https://www.redbubble.com/people/sindresorhus/works/30330590-ava-logo) - [Awesome list](https://github.com/avajs/awesome-ava) - [AVA Casts](http://avacasts.com) - [More…](https://github.com/avajs/awesome-ava) -## Team +## Nhóm phát triển [![Mark Wubben](https://github.com/novemberborn.png?size=100)](https://github.com/novemberborn) | [![Sindre Sorhus](https://github.com/sindresorhus.png?size=100)](https://github.com/sindresorhus) | [![Vadim Demedes](https://github.com/vadimdemedes.png?size=100)](https://github.com/vadimdemedes) ---|---|--- [Mark Wubben](https://novemberborn.net) | [Sindre Sorhus](http://sindresorhus.com) | [Vadim Demedes](https://github.com/vadimdemedes) -###### Former +###### Những người phát triển trước đây - [Kevin Mårtensson](https://github.com/kevva) - [James Talmage](https://github.com/jamestalmage) From 71c2348bba16e5ac82cd99594e943bb32182de18 Mon Sep 17 00:00:00 2001 From: Kyoz Date: Sun, 29 Jul 2018 02:04:08 +0700 Subject: [PATCH 5/7] Update vietnamese translation for recipes --- vi_VN/docs/common-pitfalls.md | 84 ++++++++ vi_VN/docs/recipes/babel.md | 192 ++++++++++++++++++ vi_VN/docs/recipes/babelrc.md | 9 + vi_VN/docs/recipes/browser-testing.md | 82 ++++++++ vi_VN/docs/recipes/code-coverage.md | 33 +++ .../recipes/debugging-with-chrome-devtools.md | 13 ++ vi_VN/docs/recipes/debugging-with-vscode.md | 60 ++++++ .../specs/001 - Improving language support.md | 96 +++++++++ vi_VN/docs/support-statement.md | 17 ++ vi_VN/readme.md | 4 +- 10 files changed, 588 insertions(+), 2 deletions(-) create mode 100644 vi_VN/docs/common-pitfalls.md create mode 100644 vi_VN/docs/recipes/babel.md create mode 100644 vi_VN/docs/recipes/babelrc.md create mode 100644 vi_VN/docs/recipes/browser-testing.md create mode 100644 vi_VN/docs/recipes/code-coverage.md create mode 100644 vi_VN/docs/recipes/debugging-with-chrome-devtools.md create mode 100644 vi_VN/docs/recipes/debugging-with-vscode.md create mode 100644 vi_VN/docs/specs/001 - Improving language support.md create mode 100644 vi_VN/docs/support-statement.md diff --git a/vi_VN/docs/common-pitfalls.md b/vi_VN/docs/common-pitfalls.md new file mode 100644 index 00000000..82532a62 --- /dev/null +++ b/vi_VN/docs/common-pitfalls.md @@ -0,0 +1,84 @@ +# Những sai lầm phổ biến + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/common-pitfalls.md), [Tiếng Việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/common-pitfalls.md) + +## ESLint plugin + +Nếu bạn sử dụng [ESLint](http://eslint.org/), bạn có thể cài đặt [eslint-plugin-ava](https://github.com/avajs/eslint-plugin-ava). Nó sẽ giúp bạn sử dụng AVA một cách chính xác và tránh một số hiểu lầm phổ biến. + +## AVA trong Docker + +Nếu bạn chạy AVA trong Docker như là một phần của CI, bạn cần sửa các biến môi trường thích hợp. Cụ thể, thêm `-e CI=true` vào lệnh `docker exec`. Xem [#751](https://github.com/avajs/ava/issues/751). + +AVA sử dụng [is-ci](https://github.com/watson/is-ci) để quyết định xem nó có trong môi trường CI hay không, hoặc không sử dụng [các biến này](https://github.com/watson/ci-info/blob/master/index.js). + +## AVA và các giới hạn kết nối client + +Có thể bạn đang sử dụng một service có sự hạn chế, chỉ cho phép một số kết nối đồng thời. Ví dụ: nhiều doanh nghiệp cung cấp cơ sở dữ liệu cung cấp các gói miễn phí với sự giới hạn số lượng client có thể sử dụng cùng một lúc. AVA có thể đạt tới giới hạn khi nó chạy nhiều process, nhưng các service được viết tốt sẽ phát ra lỗi hoặc có sự điều tiết trong các trường hợp đó. Nếu dịch vụ bạn sử dụng không có những thứ đó, test của bạn sẽ bị treo. + +Theo mặc định, AVA sẽ sử dụng số process theo số [nhân vật lý](https://superuser.com/questions/1105654/logical-vs-physical-cpu-performance) trên thiết bị của bạn. Số process được giới hạn là 2 trong môi trường CI. + +Sử dụng tham số `concurrency` để giới hạn số lượng các process chạy. Ví dụ, nếu service của bạn chỉ cho phép 5 client, bạn nên chạy AVA với `concurrency=5` hoặc ít hơn. + +## Các thao tác không đồng bộ + +Có thể bạn đang chạy một hoạt động không đồng bộ bên trong một test và tự hỏi rằng tại sao nó không hoàn thành. Nếu hoạt động không đồng bộ của bạn sử dụng promise, bạn nên trả về promise: + +```js +test('fetches foo', t => { + return fetch().then(data => { + t.is(data, 'foo'); + }); +}); +``` + +Còn tốt hơn nữa, nên dùng `async` / `await`: + +```js +test('fetches foo', async t => { + const data = await fetch(); + t.is(data, 'foo'); +}); +``` + +Nếu bạn đang sử dụng callback, dùng [`test.cb`](https://github.com/avajs/ava#callback-support): + +```js +test.cb('fetches foo', t => { + fetch((err, data) => { + t.is(data, 'foo'); + t.end(); + }); +}); +``` + +Ngoài ra, hãy promisify hàm callback bằng cách sử dụng một cái gì đó như [`pify`](https://github.com/sindresorhus/pify): + +```js +test('fetches foo', async t => { + const data = await pify(fetch)(); + t.is(data, 'foo'); +}); +``` + +### Phân bổ các ngoại lệ chưa được kiểm tra cho các test + +AVA [không thể theo dõi các ngoại lệ chưa được kiểm tra](https://github.com/avajs/ava/issues/214) trở lại test đã kích hoạt chúng. Hàm Callback-taking có thể dẫn đến các trường hợp ngoại lệ vô tình mà sau đó khó có thể gỡ lỗi. Xem xét promisifying và sử dụng `async`/`await`, như ví dụ ở trên. Điều này sẽ cho phép AVA bắt được ngoại lệ và gán nó vào test một cách chính xác. + +### Tại sao các thông báo xác nhận giá trị nâng cao không được hiển thị? + +Hãy đảm bảo rằng tham số đầu tiên được truyền vào test của bạn phải được đặt tên là `t`. Đây là sự yêu cầu của [`power-assert`](https://github.com/power-assert-js/power-assert), thư viện cung cấp các thông báo nâng cao. + +```js +test('one is one', t => { + t.is(1, 1); +}); +``` + +### Các helper không được compile khi sử dụng thư mục test không mặc định + +Đây là một [vấn đề đã biết](https://github.com/avajs/ava/issues/1319). Bạn nên đặt các test của bạn vào một folder tên là `test` hoặc `__tests__`. + +--- + +Vấn đề của bạn không được liệt kê ở đây? Hãy gửi một pull request hoặc đăng nhận xét của mình vào [vấn đề này](https://github.com/avajs/ava/issues/404). diff --git a/vi_VN/docs/recipes/babel.md b/vi_VN/docs/recipes/babel.md new file mode 100644 index 00000000..100bc1ca --- /dev/null +++ b/vi_VN/docs/recipes/babel.md @@ -0,0 +1,192 @@ +# Cấu hình babel + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/babel.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/babel.md) + +AVA sử dụng [Babel 7](https://babeljs.io) để bạn có thể sử dụng cú pháp JavaScript mới nhất trong các test của mình. Chúng tôi thực hiện việc này bằng cách biên dịch các file test và helper bằng việc sử dụng preset [`@ava/stage-4`](https://github.com/avajs/babel-preset-stage-4) của chúng tôi. Chúng tôi cũng sử dụng [preset thứ 2, `@ava/transform-test-files`](https://github.com/avajs/babel-preset-transform-test-files) để bật [thông báo xác nhận nâng cao](../../readme#enhanced-assertion-messages) và phát hiện việc sử dụng các xác nhận `t.throws()` không đúng cách. + +Theo mặc định, Babel pipeline của chúng tôi được áp dụng vào các file test và helper có đuôi mở rộng là `.js`. Nếu dự án của bạn sử dụng Babel thì chúng tôi sẽ tự động biên dịch các tệp này bằng cấu hình Babel trong dự án của bạn. Cài đặt trước preset `@ava/transform-helper-files` được áp dụng trước và cuối cùng là `@ava/stage-4`. + +Nếu bạn đang sử dụng Babel cho các file source của bạn thì bạn cũng phải [cấu hình biên dịch source](#compile-sources). + +## Tùy chỉnh các AVA biên dịch các file test của bạn + +Bạn có thể ghi đè lên cấu hình Babel mặc định mà AVA sử dụng để biên dịch file test trong `package.json` hoặc `ava.config.js`. Ví dụ: cấu hình bên dưới sẽ thêm hỗ trợ cho cú pháp JSX và các tính năng của stage 3: + +```json +{ + "ava": { + "babel": { + "testOptions": { + "plugins": ["@babel/plugin-syntax-jsx"], + "presets": ["@babel/preset-stage-3"] + } + } + } +} +``` + +Tất cả các tùy chọn `.babelrc` đều được cho phép bên trong đối tượng `testOptions`. + +## Đặt lại bộ nhớ đệm của AVA + +AVA lưu trữ các file test và helper đã biên dịch. Nó sẽ tự động biên dịch lại các tệp này khi bạn thay đổi chúng, tuy nhiên nó không thể phát hiện các bản cập nhật của các plugin và cài đặt trước Babel của bạn hoặc các thay đổi đối với file cấu hình Babel của bạn. + +Thay vào đó hãy chạy lệnh dưới đây để reset lại cache của AVA khi bạn thay đổi cấu hình hoặc cập nhật các plugin hay preset: + +```console +$ npx ava --reset-cache +``` + +## Thêm các tiện ích bổ sung + +Bạn có thể định cấu hình của AVA để nhận ra các phần mở rộng file bổ sung và biên dịch các file test và helper đó bằng Babel: + +```json +{ + "ava": { + "babel": { + "extensions": [ + "js", + "jsx" + ] + } + } +} +``` + +Xem thêm [tùy chọn `mở rộng`](../../readme.md#options) của AVA. + +## Làm cho AVA bỏ qua tùy chỉnh Babel trong dự án của bạn + +Bạn có thể không muốn AVA sử dụng các tùy chọn Babel trong dự án của bạn, ví dụ nếu dự án của bạn dựa vào Babel 6. Bạn có thể đặt tùy chọn `babelrc` thành `false`: + +```json +{ + "ava": { + "babel": { + "testOptions": { + "babelrc": false + } + } + } +} +``` + +## Vô hiệu hóa stage-4 preset của AVA + +Bạn có thể tắt stage-4 preset của AVA: + +```json +{ + "ava": { + "babel": { + "testOptions": { + "presets": [ + ["module:ava/stage-4", false] + ] + } + } + } +} +``` + +Lưu ý rằng điều này *không* ngăn AVA biên dịch các file test của bạn bằng Babel. + +Bạn **phải** vô hiệu hóa preset bằng cách cấu hình nó trong `testOptions`. AVA sẽ vẫn áp dụng giá trị đặt sẵn nếu bạn định cấu hình nó trong các tệp khác (ví dụ: tệp `babelrc`). Đây là [do vấn đề của Babel](https://github.com/babel/babel/issues/7920). + +## Duy trì cú pháp module ES + +Theo mặc định preset stage-4 của AVA sẽ chuyển đối cú pháp của module ES thành CommonJS. Bạn có thể vô hiệu hóa điều này: + +```json +{ + "ava": { + "babel": { + "testOptions": { + "presets": [ + ["module:ava/stage-4", {"modules": false}] + ] + } + } + } +} +``` + +Bạn **phải** định cấu hình preset trong `testOptions` để giữ nguyên cú pháp module ES. AVA vẫn sẽ áp dụng preset nếu bạn cấu hình nó trong các file khác (ví dụ: file `.babelrc`). Điều này là [do vấn đề của Babel](https://github.com/babel/babel/issues/7920). + +Bạn sẽ phải sử dụng module [`esm`](https://github.com/standard-things/esm) để AVA vẫn có thể tải các file test của bạn. [Xem công thức của chúng tôi để biết thêm chi tiết](./es-modules.md). + +## Vô hiệu hóa Babel pipeline của AVA + +Bạn hoàn toàn có thể vô hiệu hóa việc sử dụng Babel của AVA: + +```json +{ + "ava": { + "babel": false, + "compileEnhancements": false + } +} +``` + +## Sử dụng Babel polyfills + +AVA cho phép bạn viết các test của mình bằng cách sử dụng cú pháp JavaScript mới, ngay cả trên các phiên bản Node.js không hỗ trợ nó. Tuy nhiên, nó sẽ không thêm hoặc sửa đổi sự tích hợp môi trường hiện tại của bạn. Ví dụ, việc sử dụng AVA sẽ không cung cấp các tính năng hiện đại như `Object.entries()` cho môi trường Node.js 6 trở xuống. + +Bằng cách load [module `polyfill` của Babel](https://babeljs.io/docs/usage/polyfill/) bạn có thể chọn sử dụng các tính năng này. Lưu ý rằng điều này sẽ sửa đổi môi trường, điều này có thể ảnh hưởng đến cách chương trình của bạn hoạt động. + +Bạn có thể kích hoạt module `polyfill` bằng cách thêm nó vào tùy chọn `require` của AVA: + +```json +{ + "ava": { + "require": [ + "@babel/polyfill" + ] + } +} +``` + +Bạn sẽ cần phải tự cài đặt `@babel/polyfill`. + +## Biên dịch mã nguồn + +AVA hiện không biên dịch các file source. Bạn sẽ cần phải load [module `register` của Babel](http://babeljs.io/docs/usage/require/), thứ sẽ giúp biên dịch các file source nếu cần. + +Bạn có thể kích hoạt `register` bằng cách thêm nó vào tùy chọn `require` của AVA: + +```json +{ + "ava": { + "require": [ + "@babel/register" + ] + } +} +``` + +Bạn sẽ cần phải tự cài đặt `@babel/register`. + +`@babel/register` cũng *sẽ* xử lý các file test và helper. Đối với hầu hết các trường hợp sử dụng, điều này là không cần thiết. Nếu bạn tạo một file với yêu cầu `@babel/register` bạn có thể cho nó biết đường dẫn file nào cần phải bỏ qua. Ví dụ trong thư mục `test` của bạn tạo `_register.js`: + +```js +// test/_register.js: +require('@babel/register')({ + // Các pattern này liên quan đến thư mục dự án (nơi file `package.json` tồn tại): + ignore: ['test/*'] +}); +``` + +Bây giờ thay vì yêu cầu `@babel/register`, hãy yêu cầu `test/_register`: + +```json +{ + "ava": { + "require": [ + "test/_register.js" + ] + } +} +``` + +Lưu ý rằng việc load `@babel/register` trong mỗi worker process có ảnh hưởng hiệu năng không nhỏ. Nếu bạn có nhiều file test, bạn có thể sẽ muốn xem xét sử dụng một build step để biên dịch các nguồn của bạn. Đây không phải là điều lý tưởng, vì nó phức tạp khi sử dụng chế độ theo dõi của AVA, vì vậy chúng tôi khuyên bạn nên dùng `@babel/register` cho đến khi chi phí cho hiệu năng trở nên quá lớn. Thiết lập một bước biên dịch trước nằm ngoài phạm vi của tài liệu này, nhưng chúng tôi khuyên bạn nên kiểm tra một trong các [cách xây dựng hệ thống hỗ trợ Babel](http://babeljs.io/docs/setup/). Đây là [một vấn đề](https://github.com/avajs/ava/issues/577) đang được thảo luận về các cách mà chúng tôi có thể làm cho trải nghiệm này được tốt hơn. diff --git a/vi_VN/docs/recipes/babelrc.md b/vi_VN/docs/recipes/babelrc.md new file mode 100644 index 00000000..2b8f9548 --- /dev/null +++ b/vi_VN/docs/recipes/babelrc.md @@ -0,0 +1,9 @@ +# Cấu hình Babel + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/babelrc.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/babelrc.md) + +Công thức này đã được di chuyển. Xem [công thức babel mới](babel.md) của chúng tôi. + +--- + +Nếu bạn sử dụng một phiên bản AVA cũ, xin hãy xem [phiên bản 0.25.0 của công thức này](https://github.com/avajs/ava/blob/v0.25.0/docs/recipes/babelrc.md). diff --git a/vi_VN/docs/recipes/browser-testing.md b/vi_VN/docs/recipes/browser-testing.md new file mode 100644 index 00000000..fe3fa6b0 --- /dev/null +++ b/vi_VN/docs/recipes/browser-testing.md @@ -0,0 +1,82 @@ +# Thiết lập AVA để test browser + +Các bản dịch: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/docs/recipes/browser-testing.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/browser-testing.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/docs/recipes/browser-testing.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/docs/recipes/browser-testing.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/docs/recipes/browser-testing.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/browser-testing.md) + +AVA [vẫn chưa](https://github.com/avajs/ava/issues/24) hỗ trợ chạy test trên browser. Tuy nhiên, các thư viện JavaScript yêu cầu các global cụ thể của browser (`window`, `document`, `navigator`, v.v.) vẫn có thể được kiểm tra bằng AVA, bằng cách mô phỏng các global này. + +Công thức này hoạt động cho bất kỳ thư viện nào cần một môi trường mô phỏng browser. + +## Cài đặt browser-env + +> **❗️ Lưu ý quan trọng** +> +>`browser-env` thêm vào các thuộc tính từ window namespace `jsdom` vào namespace toàn cục của Node.js. Điều này rõ ràng là [không được khuyến khích](https://github.com/tmpvar/jsdom/wiki/Don't-stuff-jsdom-globals-onto-the-Node-global) bởi `jsdom`. Vui lòng đọc qua trang wiki được liên kết và đảm bảo rằng bạn hiểu được các sự phản đối. Nếu bạn không có nhiều dependency cũng yêu cầu một môi trường browser thì [`window`](https://github.com/lukechilds/window#universal-testing-pattern) có thể là một giải pháp tốt hơn. + +Cài đặt [browser-env](https://github.com/lukechilds/browser-env). + +> Mô phỏng môi trường browser toàn cục bằng jsdom. + +``` +$ npm install --save-dev browser-env +``` + +## Cài đặt browser-env + +Tạo một file helper và đặt nó bên trong thư mục `test/helpers`. Điều này để đảm bảo AVA không coi nó là một file test. + +`test/helpers/setup-browser-env.js`: + +```js +import browserEnv from 'browser-env'; +browserEnv(); +``` + +Theo mặc định, `browser-env` sẽ thêm tất cả các biến của browser vào phạm vi toàn cục của Node.js, tạo ra một môi trường browser hoàn chỉnh. Điều này có khả năng tương thích tốt với hầu hết các thư viện front-end, tuy nhiên, nói chung thì nó cũng không phải là một ý tường hay khi tạo nhiều biến toàn cục nếu bạn không cần đến chúng. Nếu bạn biết chính xác browser nào bạn cần, bạn có thể truyền vào một mảng của chúng. + +```js +import browserEnv from 'browser-env'; +browserEnv(['window', 'document', 'navigator']); +``` + +Bạn có thể phơi bày ra nhiều biến toàn cục hơn bằng cách gán chúng cho đối tượng `global`. Ví dụ, jQuery thường có sẵn thông qua biến `$`: + +```js +import browserEnv from 'browser-env'; +import jQuery from 'jquery'; + +browserEnv(); +global.$ = jQuery(window); +``` + +## Cấu hình test đề dùng browser-env + +Cấu hình để AVA `require` helper trước mỗi file test. + +`package.json`: + +```json +{ + "ava": { + "require": [ + "./test/helpers/setup-browser-env.js" + ] + } +} +``` + +## Thưởng thức thôi! + +Viết các test của bạn và tận hưởng một môi trường mô phỏng browser. + +`test.js`: + +```js +import test from 'ava'; + +test('Insert to DOM', t => { + const div = document.createElement('div'); + document.body.appendChild(div); + + t.is(document.querySelector('div'), div); +}); +``` diff --git a/vi_VN/docs/recipes/code-coverage.md b/vi_VN/docs/recipes/code-coverage.md new file mode 100644 index 00000000..0545a141 --- /dev/null +++ b/vi_VN/docs/recipes/code-coverage.md @@ -0,0 +1,33 @@ +# Code coverage + +Các bản dịch: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/docs/recipes/code-coverage.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/code-coverage.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/docs/recipes/code-coverage.md), [日本語](https://github.com/avajs/ava-docs/blob/master/ja_JP/docs/recipes/code-coverage.md), [Português](https://github.com/avajs/ava-docs/blob/master/pt_BR/docs/recipes/code-coverage.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/docs/recipes/code-coverage.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/docs/recipes/code-coverage.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/code-coverage.md) + +Sử dụng [nyc] command-line-client cho [istanbul] để tính toán code coverage cho các test của bạn. + +Đầu tiên hãy cài đặt [nyc]: + +``` +$ npm install --save-dev nyc +``` + +Để đơn giản, hãy chạy AVA thông qua [nyc]. Trong file `package.json` của bạn: + +```json +{ + "scripts": { + "test": "nyc ava" + } +} +``` + +Có thể bạn sẽ muốn loại trừ các thư mục `.nyc_output` và `coverage` khỏi source control. Giả sử bạn đang sử dụng Git, thêm phần sau đây vào file `.gitignore`: + +``` +.nyc_output +coverage +``` + +Nếu bạn đang biên dịch các file source của bạn bằng cách sử dụng Babel, bạn có thể sẽ muốn áp dụng thiết bị đo đạc của Istanbul như là một phần của quá trình biên dịch các file source. Điều này sẽ mang lại kết quả tốt hơn so với công cụ của Babel. Xem [*Sử dụng Istalbul với ES2015+* hướng dẫn](https://istanbul.js.org/docs/tutorials/es2015/). AVA sẽ đặt `NODE_ENV=test` cho bạn. Lưu ý rằng kể từ tháng 2 năm 2018, hướng dẫn này chưa được cập nhật cho Babel 7. + +[Istanbul]: https://istanbul.js.org/ +[nyc]: https://github.com/istanbuljs/nyc diff --git a/vi_VN/docs/recipes/debugging-with-chrome-devtools.md b/vi_VN/docs/recipes/debugging-with-chrome-devtools.md new file mode 100644 index 00000000..d39c2ed4 --- /dev/null +++ b/vi_VN/docs/recipes/debugging-with-chrome-devtools.md @@ -0,0 +1,13 @@ +# Gỡ lỗi cho các test với Chrome DevTools + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/debugging-with-chrome-devtools.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/debugging-with-chrome-devtools.md) + +Dùng [inspect-process](https://github.com/jaridmargolin/inspect-process) để có thể dễ dàng khởi chạy một session gỡ lỗi với Chrome DevTools. + +```console +$ npm install --global inspect-process +``` + +```console +$ inspect node_modules/ava/profile.js some/test/file.js +``` diff --git a/vi_VN/docs/recipes/debugging-with-vscode.md b/vi_VN/docs/recipes/debugging-with-vscode.md new file mode 100644 index 00000000..53f81354 --- /dev/null +++ b/vi_VN/docs/recipes/debugging-with-vscode.md @@ -0,0 +1,60 @@ +# Gỡ lỗi cho các test với Visual Studio Code + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/debugging-with-vscode.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/debugging-with-vscode.md) + +## Cài đặt + +Trong thanh bên cạnh, nhấp vào `Debug`. + +Thêm vào cấu hình mới trong trình đơn thả xuống bên cạnh nút `Debug` màu xanh: `Add configuration`. Thao tác này sẽ mở `launch.json` với tất cả cấu hình debug. + +Thêm các cấu hình sau vào đối tượng `configurations`: + +```json +{ + "type": "node", + "request": "launch", + "name": "Run AVA test", + "program": "${workspaceRoot}/node_modules/ava/profile.js", + "args": [ + "${file}" + ], + "skipFiles": [ + "/**/*.js" + ] +} +``` + +Lưu cấu hình này lại sau khi đã tinh chỉnh. + +## Gỡ lỗi + +> **Lưu ý:** File mà bạn muốn gỡ lỗi, phải đang mở và hoạt động + +> **Lưu ý:** Các breakpoint trong VSCode thỉnh thoảng hơi bị lỗi (đặc biệt là với code không đồng bộ). `debugger;`, luôn hoạt động ổn. + +Đặt các breakpoint vào code **hoặc** viết `debugger;` tại điểm cần dừng. + +Nhấn nút `Debug` màu xanh bên cạnh danh sách các cấu hình ở trên cùng bên trái trong chế độ xem `Debug`. Khi breakpoint được nhấn, bạn có thể đánh giá các biến và từng bước mà code chạy. + +## Gỡ lỗi nối tiếp + +Theo mặc định, AVA chạy các test đồng thời. Điều này có thể làm thêm phức tạp cho việc gỡ lỗi. Thêm một cấu hình với đối số `--serial` để AVA chỉ chạy một test tại một thời điểm: + +```json +{ + "type": "node", + "request": "launch", + "name": "Run AVA test serially", + "program": "${workspaceRoot}/node_modules/ava/profile.js", + "args": [ + "--serial", + "${file}" + ], + "skipFiles": [ + "/**/*.js" + ] +} +``` + +*Lưu ý rằng, nếu các test của bạn không được phân chia đúng cách, các lỗi kiểm tra nhất định có thể không xuất hiện khi chạy test một cách tuần tự.* diff --git a/vi_VN/docs/specs/001 - Improving language support.md b/vi_VN/docs/specs/001 - Improving language support.md new file mode 100644 index 00000000..322a18bb --- /dev/null +++ b/vi_VN/docs/specs/001 - Improving language support.md @@ -0,0 +1,96 @@ +# Cải thiện việc hỗ trợ ngôn ngữ + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/specs/001%20-%20Improving%20language%20support.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/specs/001%20-%20Improving%20language%20support.md) + +Một [RFC](http://blog.npmjs.org/post/153881413635/some-notes-on-rfcs) với sự đề xuất cải thiện hỗ trợ của AVA cho các dự án Babel, React và Typescript + +## Báo cáo vấn đề + +Việc tích hợp AVA với các dự án dựa trên Babel là quá cồng kềnh. Người dùng cần phải cấu hình `babel-core / register` để các file trợ giúp hoặc source file được biên dịch. Cách cấu hình các file test được biên dịch là khó hiểu. Các source file có thể [cần một cấu hình khác hoặc được load sẵn trong AVA][lý do tùy chọn source] so với khi build cho bản phân phối. + +Không có hỗ trợ để viết các test và source trong các ngôn ngữ khác như TypeScript hoặc JSX. + +## Lai lịch + +AVA dùng Babel để cho phép người dùng viết các test sử dụng các đề xuất [ES2015](https://babeljs.io/docs/plugins/preset-es2015/) và [stage-2](https://babeljs.io/docs/plugins/preset-stage-2/). Thông báo xác nhận được [tăng cường bằng cách sử dụng một Babel plugin](https://github.com/avajs/ava/pull/46) và một plugin khác được dùng để [phát hiện việc sử dụng đúng và không đúng `t.throws()`](https://github.com/avajs/ava/pull/742). + +Ban đầu `babel/register` được [dùng trực tiếp](https://github.com/avajs/ava/pull/23), và được áp dụng vào các file test, helper và source. Ngay sau đó điều này được thay đổi nên chỉ có [file test được transpile](https://github.com/avajs/ava/issues/50). Các hành vi trước đây đã [được coi như là một lỗi](https://github.com/avajs/ava/issues/108#issuecomment-151245367), có lẽ vì nó làm cho AVA biên dịch các file nguồn đi ngược lại với ý định của người dùng. + +Các người dùng sau đó đã được [khuyên thêm `babel-core/register` vào danh sách các module tự động cần thiết khi chạy các test](https://github.com/avajs/ava#transpiling-imported-modules). Nhưng hóa ra việc load Babel trong mỗi process là khá chậm, và thay vào đó các nỗ lực đã được thực hiện để biên dịch các file [helper][1078] và [source][945] trong process chính của AVA. + +Trong khi đó AVA đã chuyển từ sử dụng 'babel/register` sang sử dụng Babel trực tiếp. Một [triển khai cache](https://github.com/avajs/ava/pull/352) đã được xếp ở lớp trên cùng. + +AVA chỉ tìm kiếm các file test với đuôi mở rộng `.js`, ngay cả khi các glob pattern được kết hợp rõ ràng với các file khác. Theo định nghĩa, điều này không ngăn cản việc các file [JSX và TypeScript được chọn](https://github.com/avajs/ava/issues/631). + +## Các phương pháp khả thi + +[#945][945] cố gắng để biên dịch tất cả các dependency của file test (cả các file helper và source) trong process chính. Ngoài các vấn đề chưa được giải quyết, một nhược điểm lớn là nó không thể xử lý các yêu cầu động, vì chúng xảy ra trong các worker process thay vì process chính. Việt quét các depencency đã làm tăng thêm chi phí cho chính nó. + +[#1078][1078] biên dịch trước các file trong process chính, như cách các file test được biên dịch trước. Điều này sẽ hoạt động có lẽ là tốt, nhưng tất nhiên là sẽ có hạn chế về mặt biên dịch các file helper. + +[Kết luận của #631][631 conclusion] là cho phép các phần mở rộng của file test khác nhau được chỉ định. Nhưng không may chỉ đơn thuần cho phép các phần mở rộng khác là không đủ. AVA sẽ vẫn giả sử rằng các file test chỉ chứa JavaScript. Nó sẽ không thể chạy JSX hoặc TypeScript. + +[#1122](https://github.com/avajs/ava/pull/1122) xây dựng trên [đề xuất trong #631][631 conclusion] bằng cách phát hiện xem phần mở rộng `.ts` có được cấu hình là tự động biên dịch test đó hay không bằng cách sử dụng TypeScript. Thật không may là nó không rõ ràng làm thế nào để điều này hoạt động với các file source mà không cần chạy vào cùng các vấn đề về hiệu suất mà chúng tôi đã thấy với Babel. Các file test TypeScript sẽ không nhận được các xác nhận nâng cao hoặc sự bảo vệ chống lại việc sử dụng `t.throws()` không đúng cách. Thật khó để truyền đạt điều này cho người dùng khi cách hỗ trợ TypeScript được kích hoạt là chỉ định tùy chọn của một `extension`. + +## Đề xuất cụ thể + +Theo mặc định, AVA sẽ biên dịch các file test và helper. Nó sử dụng Babel, nhưng chỉ với các plugin cho đề xuất stage-4 và các tiêu chuẩn được phê chuẩn (hiện tại đó là ES2016 cộng với các đề xuất đã đạt đến stage-4 và sẽ được đưa vào ES2017). Điều này có nghĩa là AVA hỗ trợ cú pháp giống như ESLint. + +AVA đã không còn áp dụng [`babel-plugin-transform-runtime`](https://babeljs.io/docs/plugins/transform-runtime/). Plugin này tạo các alias ES2015 toàn cục, là điều không cần thiết, vì chúng ta đang nhắm đến mục tiêu Node.js 4. Đây là một [sai lầm đã biết](https://github.com/avajs/ava/issues/1089). + +Các biến đổi khác của AVA, chẳng hạn như `babel-plugin-espower` và `babel-plugin-ava-throws-helper`, sẽ được đóng gói thành một preset `babel-preset-ava` và tự động được áp dụng. (Nếu cần, chúng tôi có thể thêm tùy chọn áp dụng `babel-plugin-transform-runtime` cùng với [rewrite logic](https://github.com/avajs/ava/blob/033d4dcdcbdadbf665c740ff450c2a775a8373dc/lib/babel-config.js#L53:L61) chúng tôi áp dụng để sửa chữa các đường dẫn (path). Chúng ta nên xem xét cách tiếp cận này.) + +### Các dự án Babel + +Ở trên giả định AVA được sử dụng với các dự án JavaScript thông thường mà không yêu cầu phải biên dịch. Nhiều người dùng mặc dù đã có một Babel pipeline tại chỗ và muốn sử dụng AVA mà không cần phải biên dịch trước các file source của họ. + +Để đơn giản nhất, thiết lập `"babel": true` trong cấu hình AVA sẽ cho phép AVA hỗ trợ cho các dự án Babel. Các file test và helper sẽ được biên dịch theo như ở trên, nhưng các file source bây giờ đây cũng tự động được biên dịch. + +AVA xem xét các file `package.json` hoặc `.babelrc` của các dự án cho các tùy chọn Babel sử dụng để biện dịch các file source (lý tưởng là chúng ta có thể trích xuất một đối tượng cấu hình Babel thích hợp từ hai vị trí này). Đây là cách đơn giản hóa quản lý cấu hình thực tế của Babel, tìm kiếm file tùy chọn gần nhất với tệp đang được biên dịch. Nhìn vào hai file cụ thể này cho phép AVA sử dụng kết quả biên dịch được lưu trong bộ nhớ cache mà không cần phải tải Babel, trong khi vẫn biên dịch lại các file source nếu các tùy chọn bị thay đổi. + +Việc sử lý các dự án Babel của AVA có thể được cấu hình thêm bằng cách truyền một đối tượng tùy chọn thay vì `true`: + +* `compileSources: true | false`: mặc định là `true`, xác định xem các source có được biên dịch hay không. +* `extensions: "js" | ["js", "jsx", ...]`: mặc định là `"js"`, chỉ định phần mở rộng của file được cho phép. Đều này mở rộng các pattern file test mặc định. +* `sourceOptions: {}`: chỉ định [Tùy chỉnh Babel] được sử dụng để biên dịch các file source. Trong bối cảnh này, `babelrc: true` làm cho các tùy chọn được hợp nhất với các tùy chọn được tìm thấy trong các file `package.json` hoặc `.babelrc` của dự án. `babelrc` mặc định là `true`. +* `testOptions: {}`: chỉ định [tùy chỉnh Babel] được sử dụng để biên dịch các file test và helper. Nếu được cung cấp, điều này sẽ vô hiệu hóa hoàn toàn cấu hình mặc định mà AVA sử dụng để biên dịch các file test và helper. Giống như `sourceOptions`, `babelrc` mặc định là `true`. Đặt `presets: ["ava"]` để áp dụng các biến đổi của AVA. + +`sourceOptions` có thể được sử dụng để mở rộng cấu hình Babel được chia sẻ để các file source có thể được tải trong các test của AVA. Ví dụ người dùng có thể [dựa vào webpack để giải quyết cú pháp module ES2015 tại thời điểm build, nhưng vẫn cần áp dụng `babel-plugin-transform-es2015-modules-commonjs` cho source để làm việc trong AVA][lý do tùy chọn source]. + +`sourceOptions` và `testOptions`, là [các tùy chỉnh của Babel], có thể chỉ định các giá trị `ignore` và `only`. Chúng chỉ được sử dụng để xác định xem tệp có cần biên dịch hay không. Chúng không ảnh hưởng đến việc lựa chọn file test hoặc theo dõi source. + +## Tài liệu sưu tập + +Dựa trên [bằng chứng khái niêm](https://github.com/avajs/ava/pull/1082) này, việc biên dịch Babel được chuyển vào các test worker. Nếu như các file source được biên dịch, AVA sẽ tải hook cần thiết của riêng nó, thay vì dựa vào `babel-core/register`. + +Tùy chọn Babel cho các file test, các file helper và source được chuẩn bị trong process chính, sau đó được chia sẻ với các worker. Các bộ nhớ đệm có nguồn gốc từ các cấu hình này cũng như các dependency khác có thể có liên quan. + +Các worker băm nội dung file thô và kiểm tra bộ nhớ cache để xem liệu kết quả được biên dịch trước đó có thể được sử dụng hay không. (Do worker có thể chạy đồng thời, nên cẩn thận để đảm bảo rằng chúng đọc các mục trong bộ nhớ cache đầy đủ. Điều đó cũng được mặc dù nếu chỉ cùng một file được biên dịch nhiều lần.) + +## Các dự án TypeScript + +Sự hỗ trợ TypeScript có thể được cung cấp theo cách tương tự như hỗ trợ Babel nâng cao được mô tả ở trên. Thiết lập `"typescript": true` trong cấu hình AVA cho phép hỗ trợ TypeScript cho các file test `.ts` và helper, cũng như các source. Một đối tượng tùy chọn cũng có thể được cung cấp. + +* `compileSources: true | false`: mặc định là `true`, xác định xem các source có được biên dịch hay không. +* `extensions: "ts" | ["ts", "tsx", ...]`: mặc định là `"ts"`, chỉ định phần mở rộng file được cho phép. Điều này mở rộng các pattern file test mặc định. +* `sourceOptions: {}`: chỉ định [tùy chọn TypeScript] được sử dụng để biên dịch các file source. Tùy chọn `extends` mặc định là file `tsconfig.json` của dự án, nếu có. Nó phải được đặt thành `null` để tránh mở rộng file này. +* `testOptions: {}`: chỉ định [tùy chọn TypeScript] được sử dụng để biên dịch các file test và helper. Hoạt động giống như `sourceOptions`, không có cấu hình mặc định cho các file test và helper, không giống như với các dự án Babel. + +Đối với `sourceOptions` và `testOptions`, là [tùy chọn TypeScript], `files`, `include` và `exclude` không ảnh hưởng đến việc lựa chọn file test hoặc theo dõi source. + +## Các chi tiết triển khai khác + +Cả sự hỗ trợ Babel và TypeScript đều có thể được cung cấp thông qua các module Node.js riêng biệt. Chúng nên implement cùng interface, để làm cho việc tích hợp với AVA dễ dàng hơn. + +AVA có hỗ trợ Babel, tuy nhiên cần phải cài đặt một dependency riêng biệt để hỗ trợ sự hoạt động của TypeScript. Một lỗi hữu ích được ghi lại nếu dependency này bị thiếu khi hỗ trợ TypeScript được bật. + +AVA chọn các tệp thử nghiệm dựa trên cấu hình `babel` và `typescript` được kết hợp. + +Các đường dẫn tương đối trong `sourceOptions` và `testOptions` [phải được giải quyết đường dẫn tương đối liên quan đến file `package.json`](https://github.com/avajs/ava/issues/707). + +[1078]: https://github.com/avajs/ava/pull/1078 +[631 conclusion]: https://github.com/avajs/ava/issues/631#issuecomment-248659780 +[945]: https://github.com/avajs/ava/pull/945 +[Babel options]: https://babeljs.io/docs/usage/api/#options +[source options reason]: https://github.com/avajs/ava/issues/1139#issuecomment-267969417 +[TypeScript options]: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html diff --git a/vi_VN/docs/support-statement.md b/vi_VN/docs/support-statement.md new file mode 100644 index 00000000..76121928 --- /dev/null +++ b/vi_VN/docs/support-statement.md @@ -0,0 +1,17 @@ +# Các phiên bản Node.js được hỗ trợ + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/support-statement.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/support-statement.md) + +AVA hỗ trợ bản release mới nhất của bất kỳ phiên bản chính nào [được hỗ trợ bởi chính Node.js](https://github.com/nodejs/Release#release-schedule). + +*Hỗ trợ* ở đây có nghĩa là chúng tôi chạy toàn bộ bộ test của chúng tôi theo các phiên bản Node.js đã cho và sẽ chấp nhận các pull request để sửa bất kỳ lỗi nào (miễn là chúng không phải là các lỗi đã biết của Node.js và sẽ được sửa ngay lập tức). Do đó, *bỏ hỗ trợ* nghĩa là chúng tôi sẽ loại bỏ các phiên bản Node.js khỏi ma trận test của chúng tôi và sẽ không còn chấp nhận các pull request cụ thể để sửa các lỗi trong các phiên bản đó nữa. + +Khi chúng tôi bỏ hỗ trợ cho phiên bản chính thức LTS-covered, chúng tôi sẽ tăng phiên bản chính của AVA (hoặc, khi chúng tôi đang ở giai đoạn `0`, phiên bản phụ). + +Chúng tôi sẽ bỏ hỗ trợ cho các phiên bản Node.js được đánh số lẻ (ví dụ: `7` hoặc `9`) *mà không* tăng phiên bản chính của AVA. + +Chúng tôi cố gắng tránh việc *vô tình* bỏ hỗ trợ cho các bản release không phải là mới nhất của Node.js. Nếu sự cố như vậy xảy ra, chúng tôi sẽ chấp nhận các pull request để khôi phục chức năng. Chúng tôi có thể quyết định bỏ qua bản release AVA lỗi và thay vào đó tăng phiên bản chính của AVA. + +Chúng tôi có thể ngưng hỗ trợ một cách rõ ràng cho các bản release Node.js mới nhất. Nếu điều này xảy ra, chúng tôi sẽ tăng phiên bản chính của AVA. Điều này có thể là do việc chấp nhận các backported API hoặc tính khả dụng của các bản release V8 trong các phiên bản Node.js sau này, hoặc trong chính bản thân AVA hay là một trong số các dependencies của chúng tôi. + +Chúng tôi có thể ngưng hỗ trợ cho một phiên bản nào đó của Node.js, trong một bản release của phiên bản release trước để tăng phiên bản, nếu phiên bản AVA mới được dự kiến là sẽ ổn định trong hoặc sau ngày hết hạn của phiên bản Node.js. diff --git a/vi_VN/readme.md b/vi_VN/readme.md index c79e2847..7c849d24 100644 --- a/vi_VN/readme.md +++ b/vi_VN/readme.md @@ -1202,9 +1202,9 @@ Bạn không thể dùng [`istanbul`](https://github.com/gotwarlost/istanbul) đ Kể từ phiên bản `5.0.0`, AVA sẽ sử dụng các source map để báo cáo coverage cho code của bạn, bất kể sự transpile. Hãy đảm bảo rằng code mà bạn đang test có bao gồm inline source map hơạc tham chiếu đến một file source map. Nếu bạn dùng `babel-register` bạn có thể đặt tùy chọn `sourceMaps` trong cấu hình Babel của bạn thành `inline`. -### Những cạm bẫy phổ biến +### Những sai lầm phổ biến -Chúng tôi có một danh sách ngày càng tăng về [các cạm bẫy phổ biến](docs/common-pitfalls.md) mà bạn có thể gặp phải khi sử dụng AVA. Nếu bạn gặp phải bất kì vấn đề nào bạn nghĩ là phổ biến, hãy bình luận trong [issue này](https://github.com/avajs/ava/issues/404). +Chúng tôi có một danh sách ngày càng tăng về [các sai lầm phổ biến](docs/common-pitfalls.md) mà bạn có thể gặp phải khi sử dụng AVA. Nếu bạn gặp phải bất kì vấn đề nào bạn nghĩ là phổ biến, hãy bình luận trong [issue này](https://github.com/avajs/ava/issues/404). ## FAQ From 7cac48ded3a224524a5476913f83479bce416b12 Mon Sep 17 00:00:00 2001 From: Kyoz Date: Sun, 29 Jul 2018 21:59:52 +0700 Subject: [PATCH 6/7] Done vietnamese translates for recipes --- vi_VN/docs/common-pitfalls.md | 2 +- vi_VN/docs/recipes/debugging-with-webstorm.md | 57 ++++ .../recipes/endpoint-testing-with-mongoose.md | 136 +++++++++ vi_VN/docs/recipes/endpoint-testing.md | 31 ++ vi_VN/docs/recipes/es-modules.md | 87 ++++++ vi_VN/docs/recipes/flow.md | 68 +++++ .../isolated-mongodb-integration-tests.md | 64 ++++ vi_VN/docs/recipes/jspm-systemjs.md | 65 +++++ .../passing-arguments-to-your-test-files.md | 32 ++ .../docs/recipes/precompiling-with-webpack.md | 274 ++++++++++++++++++ vi_VN/docs/recipes/react.md | 146 ++++++++++ vi_VN/docs/recipes/test-setup.md | 138 +++++++++ vi_VN/docs/recipes/typescript.md | 135 +++++++++ vi_VN/docs/recipes/vue.md | 77 +++++ vi_VN/docs/recipes/watch-mode.md | 121 ++++++++ vi_VN/docs/recipes/when-to-use-plan.md | 142 +++++++++ vi_VN/readme.md | 14 +- 17 files changed, 1581 insertions(+), 8 deletions(-) create mode 100644 vi_VN/docs/recipes/debugging-with-webstorm.md create mode 100644 vi_VN/docs/recipes/endpoint-testing-with-mongoose.md create mode 100644 vi_VN/docs/recipes/endpoint-testing.md create mode 100644 vi_VN/docs/recipes/es-modules.md create mode 100644 vi_VN/docs/recipes/flow.md create mode 100644 vi_VN/docs/recipes/isolated-mongodb-integration-tests.md create mode 100644 vi_VN/docs/recipes/jspm-systemjs.md create mode 100644 vi_VN/docs/recipes/passing-arguments-to-your-test-files.md create mode 100644 vi_VN/docs/recipes/precompiling-with-webpack.md create mode 100644 vi_VN/docs/recipes/react.md create mode 100644 vi_VN/docs/recipes/test-setup.md create mode 100644 vi_VN/docs/recipes/typescript.md create mode 100644 vi_VN/docs/recipes/vue.md create mode 100644 vi_VN/docs/recipes/watch-mode.md create mode 100644 vi_VN/docs/recipes/when-to-use-plan.md diff --git a/vi_VN/docs/common-pitfalls.md b/vi_VN/docs/common-pitfalls.md index 82532a62..c2a50e7e 100644 --- a/vi_VN/docs/common-pitfalls.md +++ b/vi_VN/docs/common-pitfalls.md @@ -18,7 +18,7 @@ Có thể bạn đang sử dụng một service có sự hạn chế, chỉ cho Theo mặc định, AVA sẽ sử dụng số process theo số [nhân vật lý](https://superuser.com/questions/1105654/logical-vs-physical-cpu-performance) trên thiết bị của bạn. Số process được giới hạn là 2 trong môi trường CI. -Sử dụng tham số `concurrency` để giới hạn số lượng các process chạy. Ví dụ, nếu service của bạn chỉ cho phép 5 client, bạn nên chạy AVA với `concurrency=5` hoặc ít hơn. +Sử dụng cờ `concurrency` để giới hạn số lượng các process chạy. Ví dụ, nếu service của bạn chỉ cho phép 5 client, bạn nên chạy AVA với `concurrency=5` hoặc ít hơn. ## Các thao tác không đồng bộ diff --git a/vi_VN/docs/recipes/debugging-with-webstorm.md b/vi_VN/docs/recipes/debugging-with-webstorm.md new file mode 100644 index 00000000..8a2dc613 --- /dev/null +++ b/vi_VN/docs/recipes/debugging-with-webstorm.md @@ -0,0 +1,57 @@ +# Gỡ lỗi cho các test với WebStorm + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/debugging-with-webstorm.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/debugging-with-webstorm.md) + +Bắt đầu từ phiên bản 2016.2, [WebStorm](https://www.jetbrains.com/webstorm/) và các IDE của JetBrains (IntelliJ IDEA Ultimate, PHPStorm, PyCharm Professional, và RubyMine với plugin Node.js đã được cài đặt) cho phép bạn gỡ lỗi các AVA test. + + +## Cài đặt dùng Node.js + +Thêm một cấu hình *Node.js Run/Debug*; chọn `Edit Configurations...` từ danh sách thả xuống ở phía trên bên phải, sau đó nhấp vào `+` và chọn *Node.js*. + +Trong trường `JavaScript file`, chỉ định đường dẫn đến AVA trong thư mục `node_modules` của dự án: `node_modules/.bin/ava` trên macOS và Linux hoặc `node_modules/.bin/ava.cmd` trên Windows. + +Trong `Application parameters` nhập các cờ CLI mà bạn đang sử dụng và các file test mà bạn muốn gỡ lỗi, ví dụ như `--verbose test.js`. + +Trong `Node parameters`, cho phiên bản Node.js 7+, nhập vào cờ `--inspect-brk` để kích hoạt Node inspector. Đối với các phiên bản cũ hơn, sử dụng `--debug-brk`. + +Lưu lại các cấu hình vừa thiết lập. + +## Cài đặt dùng npm + +Thực thi lệnh `npx @ava/init` trong thư mục dự án của bạn và thêm AVA vào file `package.json` của bạn. + +File `package.json` của bạn sẽ trông như này: + +```json +{ + "name": "awesome-package", + "scripts": { + "test": "ava" + }, + "devDependencies": { + "ava": "^0.20.0" + } +} +``` + +Thêm mới một *npm Run/Debug configuration*: chọn `Edit Configurations...` từ danh sách kéo xuống ở phía trên bên phải, sau đó nhấn vào `+` và chọn *npm*. + +Sử dụng các tham số cấu hình sau: + +- `package.json`: Đường dẫn đến file `package.json` trong thư mục dự án của bạn +- `Command`: `test` + +IDE của bạn sau đó sẽ thực thi lệnh `npm run test` và do đó gọi `node_modules/.bin/ava` và AVA-configuration bạn đã chỉ định trong package.json của mình. + +Trong `Node parameters`, với phiên bản Node.js 7+ truyền vào `--inspect-brk` hoặc `--debug-brk` cho các phiên bản cũ hơn. + +Đừng quên chọn một thông dịch viên Node.js. + +Lưu lại các cấu hình. + +## Gỡ lỗi + +Đặt các breakpoint trong code của bạn. + +Nhấn nút `Debug` màu xanh nằm bên cạnh danh sách cấu hình ở trên cùng bên phải. *Cửa sổ công cụ gỡ lỗi* sẽ xuất hiện. Khi breakpoint được kích hoạt, bạn có thể đánh giá các biến và từng bước chạy trong code của mình. Khi gỡ lỗi nhiều file test, bạn có thể chuyển đổi giữa các process bằng cách sử dụng menu thả xuống trong khung Frames. diff --git a/vi_VN/docs/recipes/endpoint-testing-with-mongoose.md b/vi_VN/docs/recipes/endpoint-testing-with-mongoose.md new file mode 100644 index 00000000..0035bed2 --- /dev/null +++ b/vi_VN/docs/recipes/endpoint-testing-with-mongoose.md @@ -0,0 +1,136 @@ +# Test endpoint với Mongoose + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/endpoint-testing-with-mongoose.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/endpoint-testing-with-mongoose.md) + +Công thức này chỉ bạn cách làm thế nào để test endpoint của bạn với AVA và Mongoose, giả sử bạn đang sử dụng Express làm framework của mình. + +## Cài đặt + +Công thức này sử dụng các thư viện sau: + +1. [`mongod-memory-server`](https://github.com/nodkz/mongodb-memory-server) (Server in-memory MongoDB) +2. [SuperTest](https://github.com/visionmedia/supertest) (Thư viện test endpointy) +3. [Mongoose](http://mongoosejs.com) + +Cài đặt hai thư viện đầu tiên bằng cách chạy đoạn code sau: + +```console +$ npm install --save-dev mongodb-memory-server supertest +``` + +Bạn phải cài đặt Mongoose trước. Nếu không, hãy chạy đoạn code sau để cài đặt nó: + +(Lưu ý: Bạn cần ít nhất là phiên bản v4.11.3) + +```console +$ npm install mongoose +``` + +## Điều kiện tiên quyết + +Bạn sẽ cần một file server và một model Mongoose. Xem các ví dụ [`server.js`](https://github.com/zellwk/ava-mdb-test/blob/master/server.js) và [`models/User.js`](https://github.com/zellwk/ava-mdb-test/blob/master/models/User.js). + +Lưu ý rằng `server.js` không khởi động ứng dụng. Thay vào đó, điều này phải được thực hiện bởi SuperTest, để các endpoint của app có thể được test. Nếu bạn đang sử dụng Express cho ứng dụng của mình, hãy đảm bảo rằng bạn có một file khởi động có import `app` và gọi `app.listen()`. + +## File test của bạn + +Đầu tiên, include các thư việc mà bạn cần: + +```js +// Các thư viện cần cho việc test +import test from 'ava' +import request from 'supertest' +import MongodbMemoryServer from 'mongodb-memory-server' +import mongoose from 'mongoose' + +// Các model và server của bạn +import app from '../server' +import User from '../models/User' +``` + +Tiếp theo, khởi động MongoDB in-memory và kết nối với Mongoose: + +```js +// Khởi động một instance của MongoDB +const mongod = new MongodbMemoryServer() + +// Tạo kết nối đến Mongoose trước khi chạy test +test.before(async () => { + const uri = await mongod.getConnectionString(); + await mongoose.connect(uri, {useMongoClient: true}); +}); +``` + +Khi bạn chạy test của mình lần đầu tiên, MongoDB sẽ tải xuống các file binary MongoDB mới nhất. Dung lượng tải xuống có thể là khoảng 70MB vì vậy quá trình này có thể mất một phút. + +Bạn sẽ muốn sử dụng cơ sở dữ liệu của mình với dữ liệu giả. Đây là một ví dụ: + +```js +test.beforeEach(async () => { + const user = new User({ + email: 'one@example.com', + name: 'One' + }); + await user.save(); +}); +``` + +Dữ liệu giả nên được xóa sau mỗi lần test: + +```js +test.afterEach.always(() => User.remove()); +``` + +Bây giờ bạn có thể sử dụng SuperTest để gửi yêu cầu endpoint của app của bạn. Sử dụng AVA cho các xác nhận giá trị của bạn: + +```js +// Lưu ý rằng các test sẽ được chạy tuần tự. Xem đoạn code dưới đây để biết lý do. + +test.serial('litmus get user', async t => { + const {app} = t.context; + const res = await request(app) + .get('/litmus') + .send({email: 'one@example.com'}); + t.is(res.status, 200); + t.is(res.body.name, 'One'); +}); + +test.serial('litmus create user', async t => { + const {app} = t.context; + const res = await request(app) + .post('/litmus') + .send({ + email: 'new@example.com', + name: 'New name' + }); + + t.is(res.status, 200); + t.is(res.body.name, 'New name'); + + // Xác minh rằng user đã được tạo trong cơ sở dữ liệu + const newUser = await User.findOne({email: 'new@example.com'}); + t.is(newUser.name, 'New name'); +}); +``` + +Cuối cùng ngắt kết nối và dừng MongoDB khi tất cả các test được thực hiện: + +```js +test.after.always(async () => { + mongoose.disconnect() + mongod.stop() +}) + +``` + +Và bạn đã hoàn tất! + +## Sử dụng lại cấu hình trên các file + +Bạn có thể chọn để extract code cho các hook `test.before`, `test.beforeEach`, `test.afterEach.always` và `test.after.always` vào các file riêng. Xem tại thêm ví dụ tại https://github.com/zellwk/ava-mdb-test. + +## Sử dụng `test.serial` thay vì `test` + +Các test của bạn có khả năng làm thay đổi cơ sở dữ liệu. Sử dụng `test()` có nghĩa là các test sẽ chạy đồng thời, điều này có thể làm cho một test ảnh hướng đến các test khác. Thay vì đó nếu bạn sử dụng `test.serial()` thì AVA chỉ chạy một test tại một thời điểm. Sau đó, bạn có thể dọn dẹp cơ sở dữ liệu giữa các lần test, làm cho các test có thể đoán trước được nhiều hơn. + +Bạn có thể chạy test đồng thời nếu bạn tạo các kết nối Mongoose riêng biệt cho từng test. Tuy nhiên, điều này khó thiết lập hơn. Bạn có thể tìm thêm thông tin [tại đây](https://github.com/nodkz/mongodb-memory-server#several-mongoose-connections-simultaneously). diff --git a/vi_VN/docs/recipes/endpoint-testing.md b/vi_VN/docs/recipes/endpoint-testing.md new file mode 100644 index 00000000..3bd3f1cd --- /dev/null +++ b/vi_VN/docs/recipes/endpoint-testing.md @@ -0,0 +1,31 @@ +# Test endpoint + +Translations: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/docs/recipes/endpoint-testing.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/endpoint-testing.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/docs/recipes/endpoint-testing.md), [日本語](https://github.com/avajs/ava-docs/blob/master/ja_JP/docs/recipes/endpoint-testing.md), [Português](https://github.com/avajs/ava-docs/blob/master/pt_BR/docs/recipes/endpoint-testing.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/docs/recipes/endpoint-testing.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/docs/recipes/endpoint-testing.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/endpoint-testing.md) + +AVA không có phương thức dựng sẵn để test endpoint, nhưng bạn có thể sử dụng bất kỳ thư việc xác nhận giá trị nào với nó. Hãy dùng [`supertest`](https://github.com/visionmedia/supertest). + +Vì các test chạy đồng thời, tốt nhất là bạn nên tạo một server instanse cho mỗi test, bởi vì nếu chúng ta tham chiếu cùng một cá thể, điều này có thể dẫn đến sự đột biến giữa các test. Điều này có thể được thực hiện với một `test.beforeEach` và `t.context`, hoặc chỉ đơn giản là một factory function: + +```js +function makeApp() { + const app = express(); + app.use(bodyParser.json()); + app.post('/signup', signupHandler); + return app; +} +``` + +Tiếp theo, chỉ cần inject server instance vào supertest. Cách duy nhất là sử dụng một promise hoặc cú pháp async/await thay vì phương thức `end` của supertest: + +```js +test('signup:Success', async t => { + t.plan(2); + + const res = await request(makeApp()) + .post('/signup') + .send({email: 'ava@rocks.com', password: '123123'}); + + t.is(res.status, 200); + t.is(res.body.email, 'ava@rocks.com'); +}); +``` diff --git a/vi_VN/docs/recipes/es-modules.md b/vi_VN/docs/recipes/es-modules.md new file mode 100644 index 00000000..ab1a83dc --- /dev/null +++ b/vi_VN/docs/recipes/es-modules.md @@ -0,0 +1,87 @@ +# Sử dụng các module ES trong AVA + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/es-modules.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/es-modules.md) + +Kể từ phiên bản Node.js 8.5.0, [ES modules](http://2ality.com/2017/09/native-esm-node.html) được hỗ trợ sẵn, nhưng phải dùng với cờ `--experimental-modules`. Nó hoạt động bằng cách sử dụng phần mở rộng của tập tin `.mjs`. AVA hiện không hỗ trợ tùy chọn command line hoặc đuôi file mở rộng mới, nhưng bạn *có thể* sử dụng module [`esm`](https://github.com/standard-things/esm) để sử dụng các cú pháp mới. + +Đây là cách bạn làm cho nó hoạt động với AVA. + +Đầu tiên, cài đặt [`esm`](https://github.com/standard-things/esm): + +``` +$ npm install esm +``` + +Cấu hình nó trong tệp `package.json` hoặc `ava.config.js` của bạn và thêm nó vào tùy chọn `"require"` của AVA. Đảm bảo thêm nó vào mục đầu tiên: + +```json +{ + "ava": { + "require": [ + "esm" + ] + } +} +``` + +Theo mặc định, AVA sẽ chuyển đối cú pháp module ES sang CommonJS. [Bạn có thể vô hiệu hóa điều này](./babel.md#preserve-es-module-syntax). + +Bây giờ bạn có thể sử dụng các module ES được hỗ trợ với AVA: + +```js +// sum.mjs +export default function sum(a, b) { + return a + b; +}; +``` + +```js +// test.js +import test from 'ava'; +import sum from './sum.mjs'; + +test('2 + 2 = 4', t => { + t.is(sum(2, 2), 4); +}); +``` + +Bạn cần phải cấu hình AVA để nó nhận ra các đuôi mở rộng `.mjs`. Nếu bạn muốn AVA áp dụng Babel preset của nó, hãy sử dụng: + +```json +{ + "ava": { + "babel": { + "extensions": [ + "js", + "mjs" + ] + } + } +} +``` + +Hoặc bạn có thể sử dụng: + +```json +{ + "ava": { + "babel": false, + "extensions": [ + "js", + "mjs" + ] + } +} +``` + +Hoặc để cho Babel được kích hoạt (có nghĩa là nó được áp dụng cho các tệp `.js`), nhưng không được áp dụng cho các file `.mjs`: + +```json +{ + "ava": { + "extensions": [ + "mjs" + ] + } +} +``` diff --git a/vi_VN/docs/recipes/flow.md b/vi_VN/docs/recipes/flow.md new file mode 100644 index 00000000..7c6ecbbd --- /dev/null +++ b/vi_VN/docs/recipes/flow.md @@ -0,0 +1,68 @@ +# Flow + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/flow.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/flow.md) + +AVA đi kèm với một file định nghĩa Flow. Điều này cho phép các nhà phát triển tận dụng Flow để viết test. + +Hướng dẫn này giả định là bạn đã thiết lập Flow cho dự án của mình. Lưu ý rằng định nghĩa của AVA đã được kiểm tra với phiên bản 0.73.0. + +Chúng tôi khuyên bạn nên sử dụng Babel pipeline tích hợp sẵn của AVA để loại bỏ annotations và declarations của Flow. AVA tự động áp dụng cấu hình Babel trong dự án của bạn, vì vậy mọi thứ chỉ có thể hoạt động mà không có sự thay đổi. Ngoài ra, hãy cài đặt [`@babel/plugin-transform-flow-strip-types`](https://www.npmjs.com/package/@babel/plugin-transform-flow-strip-types) và tùy chỉnh cấu hình của AVA trong file `package.json` (hoặc file `ava.config.js`) như sau: + +```json +{ + "ava": { + "babel": { + "testOptions": { + "plugins": ["@babel/plugin-transform-flow-strip-types"] + } + } + } +} +``` + +Xem [Tài liệu Babel](babel.md) của chúng tôi để biết thêm chi tiết. + +## Viết tests + +Tạo một file `test.js`. + +```js +// @flow +import test from 'ava'; + +const fn = async () => Promise.resolve('foo'); + +test(async (t) => { + t.is(await fn(), 'foo'); +}); +``` + +## Typing [`t.context`](https://github.com/avajs/ava#test-context) + +Theo mặc định, kiểu `t.context` sẽ là đối tượng rỗng (`{}`). AVA chìa ra một interface `TestInterface` mà bạn có thể sử dụng để áp dụng kiểu của riêng bạn cho `t.context`. Điều này có thể giúp bạn nắm bắt được lỗi tại thời điểm biên dịch: + +```js +// @flow +import anyTest from 'ava'; +import type {TestInterface} from 'ava'; + +const test: TestInterface<{foo: string}> = (anyTest: any); + +test.beforeEach(t => { + t.context = {foo: 'bar'}; +}); + +test.beforeEach(t => { + t.context.foo = 123; // lỗi: Kiểu '123' không thể gán cho kiểu 'string' +}); + +test.serial.cb.failing('very long chains are properly typed', t => { + t.context.fooo = 'a value'; // lỗi: Thuộc tính 'fooo' không tồn tại trong loại '' +}); + +test('an actual test', t => { + t.deepEqual(t.context.foo.map(c => c), ['b', 'a', 'r']); // lỗi: Thuộc tính 'map' không tồn tại trong loại 'string' +}); +``` + +Lưu ý rằng, mặc dù kiểu được truyền ở trên, khi thực thi, `t.context` là một đối tượng trừ khi nó được gán. diff --git a/vi_VN/docs/recipes/isolated-mongodb-integration-tests.md b/vi_VN/docs/recipes/isolated-mongodb-integration-tests.md new file mode 100644 index 00000000..b0bef330 --- /dev/null +++ b/vi_VN/docs/recipes/isolated-mongodb-integration-tests.md @@ -0,0 +1,64 @@ +# Các test tích hợp MongoDB riêng biệt + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/isolated-mongodb-integration-tests.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/isolated-mongodb-integration-tests.md) + +> Làm thế nào để chạy các cơ sở dữ liệu MongoDB dùng một lần trong các test AVA của bạn với sự cách lý cho mỗi test. + +Để làm điều này bạn cần sử dụng [`MongoMem`](https://github.com/CImrie/mongomem), sẽ cho phép bạn nhanh chóng chạy một server cục bộ MongoDB tạm thời. Nó sử dụng kho lưu trữ file tạm, sẽ bị hủy khi server dừng. + + +## Cài đặt server MongoDB in-memory (MongoMem) + +Trong thư mục gốc của ứng dụng, chạy lệnh: + +```console +$ npm install --save-dev mongomem +``` + + +## Sử dụng MongoMem + +Trong file test của bạn, hãy import module và chạy server. + +**Đảm bảo lệnh chạy server được đặt ở đầu file, bên ngoài tất cả các test case.** + +```js +import test from 'ava'; +import {MongoDBServer} from 'mongomem'; + +test.before('start server', async t => { + await MongoDBServer.start(); +}) + +test('some feature', async t => { + const connectionString = await MongoDBServer.getConnectionString(); + + // connectionString === 'mongodb://localhost:27017/3411fd12-b5d6-4860-854c-5bbdb011cb93' + // Sử dụng `connectionString` để kết nối đến cơ sở dữ liệu với một client mà bạn chọn. Xem bên dưới để biết cách sử dụng với Mongoose. +}); +``` + + +## Dọn dẹp + +Sau khi bạn đã chạy các test của mình, bạn nên thêm một phương thức `test.after.always()` để dọn dẹp server MongoDB. Điều sẽ sẽ xóa các file tạm mà server sử dụng khi chạy. + +Việc này thường được dọn dẹp bởi hệ điều hành của bạn, nhưng tốt nhất là bạn nên tự làm nó. + +```js +test.after.always('cleanup', t => { + MongoDBServer.tearDown(); // Dọn dẹp kho lưu trữ file tạm +}); +``` + + +## Gỡ lỗi + +Nếu server dường như không khởi động, bạn có thể đặt tùy chọn `MongoDBServer.debug=true;` trước khi bạn gọi `MongoDBServer.start()`. Điều này sẽ cho phép server MongoDB in lỗi kết nối hoặc lỗi quyền sử dụng file khi nó bắt đầu. Nó kiểm tra và chọn một port có sẵn để chạy máy chủ, vì vậy các lỗi có liên quan đến các quyền sử dụng file. + + +## Extra: Thiết lập và sử dụng trong Mongoose + +[Mongoose](http://mongoosejs.com) là một Object-Document-Mapper (ODM) mạnh mẽ cho MongoDB. Tham khảo tài liệu của nó để bắt đầu với Mongoose. + +Để sử dụng Mongoose một cách hiệu quả với AVA, hãy xem [Tài liệu tích hợp Mongoose](endpoint-testing-with-mongoose.md). diff --git a/vi_VN/docs/recipes/jspm-systemjs.md b/vi_VN/docs/recipes/jspm-systemjs.md new file mode 100644 index 00000000..9cb40c18 --- /dev/null +++ b/vi_VN/docs/recipes/jspm-systemjs.md @@ -0,0 +1,65 @@ +# JSPM và SystemJS cho ES2015 + +Translations: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/jspm-systemjs.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/jspm-systemjs.md) + +Việc này đòi hỏi một trình trợ giúp loader đặc biệt để giải quyết chính xác các gói `import`s của các package trong JSPM khi bạn sử dụng AVA. Mục đích của loader là cho phép bạn chạy test của mình mà không cần phải xây dựng trước dự án JSPM của bạn. + +## Cài đặt + +Công thức này chỉ được test với JSPM v0.17.0-beta.22, nhưng nó sẽ hoạt động với bất kì phiên bản nào của JSPM v0.17 và có thể hoạt động với v0.16. + +### Babel + +Cài đặt .babelrc của bạn để làm việc với AVA nếu bạn chưa có. LƯU Ý: Bạn có thể giữ cấu hình bổ sung trong các tệp cấu hình JSPM của mình để ghi đè các cài đặt này trong quá trình đóng gói và xây dựng. + +``` +$ npm install --save-dev @babel/preset-env +``` + +```json +{ + "presets": ["@babel/preset-env"] +} +``` + +Bạn có thể tìm thêm thông tin về việc thiết lập Babel với AVA trong [Công thức Babel](babel.md). + +### Trình trợ giúp JSPM Loader + +Bạn sẽ cần phải cài đặt [AVA JSPM loader](https://github.com/skorlir/ava-jspm-loader) như là một dev dependency. Bạn sẽ cần phải cài đặt [`@babel/register`](https://www.npmjs.com/package/@babel/register). + +``` +$ npm install --save-dev ava-jspm-loader @babel/register +``` +Bạn cũng sẽ cần cập nhật cấu hình AVA trong `package.json` hoặc `ava.config.js` để dùng JSPM loader. + +```json +{ + "ava": { + "require": [ + "@babel/register", + "ava-jspm-loader" + ] + } +} +``` + +NODE: Nếu bạn dùng async/await trong source của bạn (không phải trong code test), bạn sẽ cần phải cài [`@babel/polyfill`](https://www.npmjs.com/package/@babel/polyfill) và thêm nó vào mảng `require`. + +### Ví dụ file test + +Lưu ý rằng bạn sẽ cần sử dụng đường dẫn `System.import` cho tất cả các file dự án của bạn. Vì vậy, nếu bạn đã đặt tên cho dự án của mình là `app` và bạn muốn import `main.js` của mình vào một file test, bạn sẽ cần phải `import main từ 'app/main'`. + +```js +import test from 'ava'; +import main from 'app/main'; // Map tới cấu hình JSPM của bạn cho "app/main.js" +import BigNumber from 'bignumber.js'; // Trong jspm_packages + +function fn() { + return Promise.resolve(new BigNumber('1234567890.123456789')); +} + +test('example test', async t => { + t.is((await fn()).toString(), '1234567890.123456789'); +}); +``` diff --git a/vi_VN/docs/recipes/passing-arguments-to-your-test-files.md b/vi_VN/docs/recipes/passing-arguments-to-your-test-files.md new file mode 100644 index 00000000..215b2c47 --- /dev/null +++ b/vi_VN/docs/recipes/passing-arguments-to-your-test-files.md @@ -0,0 +1,32 @@ +# Truyền tham số vào các file test + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/passing-arguments-to-your-test-files.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/passing-arguments-to-your-test-files.md) + +Bạn có thể truyền tham số dòng lệnh cho các file test của mình. Sử dụng đối số dòng lệnh `--` để tách các đối số của AVA khỏi chính đối số của bạn: + +```js +// test.js +import test from 'ava'; + +test('argv', t => { + t.deepEqual(process.argv.slice(2), ['--hello', 'world']); +}); +``` + +```console +$ npx ava -- --hello world +``` + +Bạn cần hai đối số dòng lệnh `--` nếu bạn gọi AVA thông qua một lệnh `npm test`: + +```json +{ + "scripts": { + "test": "ava" + } +} +``` + +```console +$ npm test -- -- --hello world +``` diff --git a/vi_VN/docs/recipes/precompiling-with-webpack.md b/vi_VN/docs/recipes/precompiling-with-webpack.md new file mode 100644 index 00000000..dc245f4a --- /dev/null +++ b/vi_VN/docs/recipes/precompiling-with-webpack.md @@ -0,0 +1,274 @@ +## Biên dịch trước các file source với webpack + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/precompiling-with-webpack.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/precompiling-with-webpack.md) + +AVA [readme](https://github.com/avajs/ava#transpiling-imported-modules) đề cập đến việc biên dịch trước các module đã import của bạn như là một sự thay thế cho trình biên dịch runtime, nhưng điều đó không được giải thích là phải làm thế nào. Công thức này thảo luận một số cách tiếp cận bằng cách sử dụng webpack v2. Nhiều cách tiếp cận được thảo luận vì mỗi phương pháp đều có ưu và nhược điểm riêng. Bạn nên chọn phương pháp phù hợp nhất với trường hợp sử dụng của mình. Xem các cuộc thảo luận ban đầu [tại đây](https://github.com/avajs/ava/pull/1385). + +- [Test một file](#test-một-file) +- [Test nhiều file](#test-nhiều-file) + +### Test một file + +Đây là trường hợp sử dụng đơn giản nhất. Bạn có thể cần điều này nếu bạn đang [sử dụng alias](https://github.com/avajs/ava/issues/1011). + +###### `webpack.config.js` + +```js +const path = require('path'); +const nodeExternals = require('webpack-node-externals'); + +module.exports = { + entry: ['test.js'], + target: 'node', + output: { + path: path.resolve(__dirname, '_build'), + filename: 'test.js' + }, + externals: [nodeExternals()], + module: { + rules: [ + { + test: /\.(js|jsx)$/, + use: 'babel-loader', + options: { + cacheDirectory: true + } + } + ] + } +}; +``` + +Các bit quan trọng là `target: 'node'`, nó sẽ bỏ qua các require `require`s (e.g. `fs`, `path`, v.v.) cụ thể của Node.js và `externals: nodeModules` để ngăn chặn webpack không cố gắng đóng gói các module bên ngoài Node.js có thể bị ngắt. + +Bây giờ bạn có thể chạy `$ npx ava _build/test.js` để chạy các test chứa trong output này. + +### Test nhiều file + +Mọi thứ phức tạp hơn một chút với nhiều file test. Chúng tôi khuyên bạn nên [sử dụng `@babel/register`](babel.md##compile-sources) cho đến khi chi phí hiệu năng trở nên quá lớn. + +Các cách tiếp cận có thể là: + +- [Tham khảo biên dịch source trong test](#tham-khảo-biên-dịch-source-trong-test) +- [File entry duy nhất](#file-entry-duy-nhất) +- [Nhiều file entry](#nhiều-file-entry) +- [Test lại các nguồn đã biên dịch](#test-lại-các-nguồn-đã-biên-dịch) + +#### Tham khảo biên dịch source trong test + +Các file source có thể được biên dịch vào thư mục `_src` và được tham chiếu trong các test. Dù điều này không ổn lắm, nhưng nó thực hiện tốt và công việc có thể được tối ưu hóa bởi [chế độ theo dõi `babel-cli`](https://babeljs.io/docs/usage/cli/#babel). + +```js +// Trước +import fresh from '../src'; +// Sau +import fresh from '../_src'; +``` + +#### File entry duy nhất + +Nhiều file test có thể được biên dịch thành một file duy nhất. Điều này có thể có hiệu suất tốt nhất, nhưng nó có chi phí. Tất cả các bài kiểm tra sẽ nằm trong cùng một file, điều này có thể khiến bạn khó biết được test nào thất bại, vì AVA không hiển thị tên file của test. Bạn cũng sẽ mất [process cô lập](https://github.com/avajs/ava#process-isolation). + +###### `webpack.config.js` + +[Câu trả lời liên quan trên Stack Overflow](http://stackoverflow.com/questions/32874025/how-to-add-wildcard-mapping-in-entry-of-webpack/34545812#34545812) + +```js +const path = require('path'); +const glob = require('glob'); +const nodeExternals = require('webpack-node-externals'); + +module.exports = { + target: 'node', + entry: glob.sync('./test/**/*.js'), + output: { + path: path.resolve(__dirname, '_build'), + filename: 'tests.js' + }, + externals: [nodeExternals()], + module: { + rules: [ + { + test: /\.(js|jsx)$/, + use: { + loader: 'babel-loader', + options: { + cacheDirectory: true + } + } + } + ] + } +}; +``` + +
+Error report comparison + +``` +# Before + aggregations-test » cardinality-agg » sets precision_threshold option + E:\Projects\repos\elastic-builder\test\_macros.js:167 + + 166: const expected = getExpected(keyName, recursiveToJSON(propValue)); + 167: t.deepEqual(value, expected); + 168: } + + Difference: + + Object { + my_agg: Object { + cardinality: Object { + - precision_threshol: 5000, + + precision_threshold: 5000, + }, + }, + } + +# After + sets precision_threshold option + E:\Projects\repos\elastic-builder\_build\tests.js:106 + + 105: column: 21 + 106: } + 107: }, + + Difference: + + Object { + my_agg: Object { + cardinality: Object { + - precision_threshol: 5000, + + precision_threshold: 5000, + }, + }, + } + +``` +
+ +#### Nhiều file entry + +Chúng tôi có thể yêu cầu webpack tạo nhiều file entry. Điều này giúp giữ lại tên file để báo cáo lỗi dễ hiểu hơn. Nhưng mỗi file entry đều có bản sao riêng của file nguồn. Điều này dẫn đến kích thước tệp lớn hơn đáng kể. Điều này có thể [có hiệu năng khá kém](https://github.com/avajs/ava/pull/1385#issuecomment-304684047) trong lần thực thi đầu tiên. + +###### `webpack.config.js` + +```js +const path = require('path'); +const glob = require('glob'); +const nodeExternals = require('webpack-node-externals'); + +const entryObj = glob.sync('./test/**/*.js') + .reduce((acc, file) => { + acc[path.basename(file, path.extname(file))] = file; + return acc; + }, {}); + +module.exports = { + target: 'node', + entry: entryObj, + output: { + path: path.resolve(__dirname, '_build'), + filename: '[name].js' + }, + externals: [nodeExternals()], + module: { + rules: [ + { + test: /\.(js|jsx)$/, + use: { + loader: 'babel-loader', + options: { + cacheDirectory: true + } + } + } + ] + } +}; +``` + +#### Test lại các nguồn đã biên dịch + +Đây là cách phức tạp nhất để thiết lập nhưng có hiệu năng khá tốt và cũng giữ lại tên file. Trong phương pháp này, chúng tôi sử dụng `babel-cli` để biên dịch các file nguồn nhưng vẫn giữ nguyên cấu trúc file. Yêu cầu đường dẫn trong các test được viết lại khi biên dịch chúng trong webpack. Ví dụ sau dành cho cấu trúc file thử nghiệm. Tùy thuộc vào cách file source và test được sắp xếp, bạn có thể cần thực hiện các thay đổi. + +Cấu trúc thư mục: + +``` +├───src +│ ├───my-pkg-fldr +│ │ ├───my-module.js +│ │ └───index.js +│ └───index.js +└───test + ├───my-pkg-fldr + │ └───my-module.test.js + └───index.test.js + +# Generated file structure +├───_src +│ ├───my-pkg-fldr +│ │ ├───my-module.js +│ │ └───index.js +│ └───index.js +└───_build + ├───my-module.test.js + └───index.test.js +``` + +npm scripts: + +```js +{ + "scripts": { + "precompile-src": "cross-env NODE_ENV=test babel src --out-dir _src", + "precompile-tests": "cross-env NODE_ENV=test webpack --config webpack.config.js", + "pretest": "npm run precompile-src && npm run precompile-tests", + "test": "cross-env NODE_ENV=test nyc --cache ava _build" + } +} +``` + +###### `webpack.config.js` + +[Các tài liệu `khác` của webpacks](https://webpack.js.org/configuration/externals/#function) + +```js +const path = require('path'); +const glob = require('glob'); +const nodeExternals = require('webpack-node-externals'); + +const entryObj = glob.sync('./test/**/*.js') + .reduce((acc, file) => { + acc[path.basename(file, path.extname(file))] = file; + return acc; + }, {}); + +module.exports = { + target: 'node', + entry: entryObj, + output: { + path: path.resolve(__dirname, '_build'), + filename: '[name].js' + }, + externals: [ + nodeExternals(), + // Viết lại đường dẫn yêu cầu để sử dụng `_src` + (context, request, callback) => { + // Đây là một chút lộn xộn vì các test không được xuất ra trong cấu trúc thư mục gốc + // test/index.test.js → _build/index.test.js + //=> ../src → ../_src + // test/my-pkg-fldr/my-module.test.js → _build/my-module.test.js + //=> ../../src → ../_src + if (request.includes('/src')) { + const requestReqwrite = request + .replace('/src', '/_src') + .replace('../../_src', '../_src'); + return callback(null, `commonjs ${requestReqwrite}`); + } + + callback(); + } + ] +}; +``` diff --git a/vi_VN/docs/recipes/react.md b/vi_VN/docs/recipes/react.md new file mode 100644 index 00000000..df6c4df1 --- /dev/null +++ b/vi_VN/docs/recipes/react.md @@ -0,0 +1,146 @@ +# Test các component của React + +Các bản dịch: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/docs/recipes/react.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/react.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/react.md) + +## Cài đặt Babel + +AVA tự động mở rộng cấu hình Babel của bạn (cấp dự án). Bạn sẽ có thể sử dụng React trong các file test của mình mà không cần bất kỳ cấu hình bổ sung nào khác. + +Tuy nhiên, nếu bạn muốn thiết lập này rõ ràng, hãy thêm giá trị preset vào các tùy chọn kiểm tra trong Babel pipeline bằng cách sửa đổi file `package.json` hoặc `ava.config.js` của bạn: + +```json +{ + "ava": { + "babel": { + "testOptions": { + "presets": ["@babel/preset-react"] + } + } + } +} +``` + +Bạn có thể tìm thêm thông tin về việc thiết lập Babel cho AVA trong [Công thức Babel](babel.md). + +## Sử dụng [Enzyme](https://github.com/airbnb/enzyme) + +Đầu tiên hãy xem cách sử dụng AVA với một trong các thư viện test React phổ biến nhất: [Enzyme](https://github.com/airbnb/enzyme). + +Nếu bạn dự định chỉ sử dụng [shallow component rendering](https://facebook.github.io/react/docs/test-utils.html#shallow-rendering), bạn không cần bất kỳ thiết lập bổ sung nào khác. + +Đầu tiên hãy cài đặt [Các package cần thiết của Enzyme](https://github.com/airbnb/enzyme/#installation): + +```console +$ npm install --save-dev enzyme react-addons-test-utils react-dom +``` + +Sau đó bạn đã có thể sử dụng Enzyme ngay: + +```js +import test from 'ava'; +import React from 'react'; +import {shallow} from 'enzyme'; + +const Foo = ({children}) => +
+ bar + {children} + bar +
; + +Foo.propTypes = { + children: React.PropTypes.any +}; + +test('has a .Foo class name', t => { + const wrapper = shallow(); + t.true(wrapper.hasClass('Foo')); +}); + +test('renders two `.Bar`', t => { + const wrapper = shallow(); + t.is(wrapper.find('.bar').length, 2); +}); + +test('renders children when passed in', t => { + const wrapper = shallow( + +
+ + ); + t.true(wrapper.contains(
)); +}); +``` + +Enzyme cũng có một helper `mount` và `render` để test trong môi trường browser thực tế. Nếu bạn muốn sử dụng những helper này, bạn sẽ cần phải thiết lập một môi trường browser. Xem [Công thức test browser](https://github.com/avajs/ava/blob/master/docs/recipes/browser-testing.md) để biết cách thực hiện. + +Để xem ví dụ về AVA làm việc cùng với Enzyme được thiết lập cho việc test browser, hãy xem [dự án mẫu này](https://github.com/adriantoine/ava-enzyme-demo). + +Đây là một ví dụ cơ bản về cách tích hợp Enzyme với AVA. Để biết thêm thông tin về việc sử dụng Enzyme để thực hiện unit test cho React component, hãy xem [Tài liệu của Enzyme](http://airbnb.io/enzyme/). + +## Sử dụng các helper của JSX + +Một cách khác để test component của React đó là sử dụng package [`react-element-to-jsx-string`](https://github.com/algolia/react-element-to-jsx-string) để so sánh các cây DOM như là các chuỗi. [`jsx-test-helpers`](https://github.com/MoOx/jsx-test-helpers) là một thư viện tốt để [shallow component rendering](https://facebook.github.io/react/docs/test-utils.html#shallow-rendering) và chuyển đổi JSX thành chuỗi để kiểm tra các component của React bằng cách sử dụng các xác nhận giá trị của AVA. + +```console +$ npm install --save-dev jsx-test-helpers +``` + +Cách sử dụng: + +```js +import test from 'ava'; +import React from 'react'; +import {renderJSX, JSX} from 'jsx-test-helpers'; + +const Foo = ({children}) => +
+ bar + {children} + bar +
; + +Foo.propTypes = { + children: React.PropTypes.any +}; + +test('renders correct markup', t => { + const actual = renderJSX(); + const expected = JSX( +
+ bar + bar +
+ ); + t.is(actual, expected); +}); + +test('renders children when passed in', t => { + const actual = renderJSX( + +
+ + ); + const expected = JSX( +
+ bar +
+ bar +
+ ); + t.is(actual, expected); +}); +``` + +Lưu ý rằng bạn phải sử dụng các biến như `actual` và `expected` vì [`power-assert` không xử lý JSX một cách chính xác](https://github.com/power-assert-js/power-assert/issues/34). + +Đây là một ví dự cơ bản về cách sử dụng `jsx-test-helpers` với AVA. Để xem cách sử dụng nâng cao của thư viện này, hãy xem [ghi chú của file test này](https://github.com/MoOx/jsx-test-helpers/blob/master/src/__tests__/index.js). + +[Dự án mẫu này](https://github.com/MoOx/jsx-test-helpers) hiển thị sự thiết lập cơ bản và tối thiểu của AVA với `jsx-test-helpers`. + +## Sử dụng các thư việc xác nhận giá trị khác + +Trong AVA, bạn có thể sử dụng bất kỳ thư viện xác nhận giá trị nào, và hiện nay đã có một số thư viện để test component của React. Dưới đây là danh sách các thư viện hoạt động tốt với AVA: + +- [`expect-jsx`](https://github.com/algolia/expect-jsx) ([Ví dụ](https://github.com/avajs/ava/issues/186#issuecomment-161317068)) +- [`unexpected-react`](https://github.com/bruderstein/unexpected-react) ([Dự án mẫu với ví dụ output](https://github.com/adriantoine/ava-unexpected-react-demo)) diff --git a/vi_VN/docs/recipes/test-setup.md b/vi_VN/docs/recipes/test-setup.md new file mode 100644 index 00000000..3618b58a --- /dev/null +++ b/vi_VN/docs/recipes/test-setup.md @@ -0,0 +1,138 @@ +# Cài đặt Test + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/test-setup.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/test-setup.md) + +Các test có thể được thiết lập bằng cách sử dụng hook `beforeEach()`. Thông thường, bạn có thể sử dụng hàm thiết lập cơ bản. Công thức này giúp bạn quyết định xem cách nào là tốt nhất trong trường hợp sử dụng của riêng mình. + +# Hook `beforeEach()` với các hàm cài đặt + +Hook `beforeEach()` có một số nhược điểm. Ví dụ, bạn không thể tắt nó cho các test cụ thể, và bạn cũng không thể áp dụng nó cho các test cụ thể. Thay vào đó, bạn có thể sử dụng các chức năng đơn giản. Điều này cho phép bạn sử dụng nhiều chức năng thiết lập cho các yêu cầu thiết lập khác nhau và gọi các phần khác nhau của thiết lập từ các test khác nhau. Bạn thậm chí có thể thiết lập các chức năng với các tham số để test có thể tùy chỉnh thiết lập riêng của chúng. + +Giả sử bạn có một hàm tương tác với hệ thống file. Có lẽ bạn chạy một vài test sử dụng `mock-fs`, và một số ít sử dụng hệ thông file thật và một thư mục tạm. Hoặc bạn có một hàm thiết lập mà bạn chạy với dữ liệu hợp lệ cho một số test và dữ liệu không hợp lệ cho các test khác, tất cả trong cùng một file test. + +Bạn có thể làm tất cả những điều này bằng cách sử dụng các hàm thiết lập đơn giản, nhưng ở đây có sự cân bằng: + +|`beforeEach()`| Các hàm thiết lập +|---|--- +| ⛔️   được sử dụng cho tất cả các test| ✅   có thể thay đổi hoặc bỏ qua tùy vào test +| ⛔️   khó khăn hơn cho người mới bắt đầu, "some magic"| ✅   dễ cho người mới bắt đầu, "no magic" +| ✅   hỗ trợ chế độ callback, tích hợp hỗ trợ cho observables| ⛔️   phải dùng promise cho các hành động bất đồng bộ +| ✅   thất bại có đầu ra thân thiện| ⛔️   lỗi được quy cho test +| ✅   tương ứng `afterEach` và `afterEach.always` để dọn dẹp| ⛔️   không thể dễ dàng dọn dẹp + +## Thiết lập test phức tạp + +Trong ví dụ này, chúng ta có một hook `beforeEach()`, và sau đó có nhiều sửa đổi hơn trong mỗi test. + +```js +test.beforeEach(t => { + setupConditionA(t); + setupConditionB(t); + setupConditionC(t); +}); + +test('first scenario', t => { + tweakSomething(t); + const someCondition = t.context.thingUnderTest(); + t.true(someCondition); +}); + +test('second scenario', t => { + tweakSomethingElse(t); + const someOtherCondition = t.context.thingUnderTest(); + t.true(someOtherCondition); +}); +``` + +Nếu có quá nhiều biến cần phải thay đổi cho mỗi test, hãy xem xét bỏ qua hook `beforeEach()` và thực hiện các bước thiết lập trong chính các test. + +```js +test('first scenario', t => { + setupConditionA(t); + setupConditionB(t, {/* options */}); + setupConditionC(t); + const someCondition = t.context.thingUnderTest(); + t.true(someCondition); +}); + +// Trong test này, setupConditionB() không bao giờ được gọi +test('second scenario', t => { + setupConditionA(t); + setupConditionC(t); + const someOtherCondition = t.context.thingUnderTest(); + t.true(someOtherCondition); +}); +``` + +## Ví dụ thực tế + +```js +test.beforeEach(t => { + t.context = { + authenticator: new Authenticator(), + credentials: new Credentials('admin', 's3cr3t') + }; +}); + +test('authenticating with valid credentials', async t => { + const isValid = t.context.authenticator.authenticate(t.context.credentials); + t.true(await isValid); +}); + +test('authenticating with an invalid username', async t => { + t.context.credentials.username = 'bad_username'; + const isValid = t.context.authenticator.authenticate(t.context.credentials); + t.false(await isValid); +}); + +test('authenticating with an invalid password', async t => { + t.context.credentials.password = 'bad_password'; + const isValid = t.context.authenticator.authenticate(t.context.credentials); + t.false(await isValid); +}); +``` + +Các test tương tự, hiện đang sử dụng các chức năng thiết lập, sẽ trông giống nhau. + +```js +function setup({username = 'admin', password = 's3cr3t'} = {}) { + return { + authenticator: new Authenticator(), + credentials: new Credentials(username, password) + }; +} + +test('authenticating with valid credentials', async t => { + const {authenticator, credentials} = setup(); + const isValid = authenticator.authenticate(credentials); + t.true(await isValid); +}); + +test('authenticating with an invalid username', async t => { + const {authenticator, credentials} = setup({username: 'bad_username'}); + const isValid = authenticator.authenticate(credentials); + t.false(await isValid); +}); + +test('authenticating with an invalid password', async t => { + const {authenticator, credentials} = setup({password: 'bad_password'}); + const isValid = authenticator.authenticate(credentials); + t.false(await isValid); +}); +``` + +## Kết hợp các hook và hàm thiết lập + +Dĩ nhiên `beforeEach()` và hàm thiết lập đơn giản có thể được sử dụng cùng nhau: + +```js +test.beforeEach(t => { + t.context = setupAllTests(); +}); + +test('first scenario', t => { + firstSetup(t); + const someCondition = t.context.thingUnderTest(); + t.true(someCondition); +}); +``` diff --git a/vi_VN/docs/recipes/typescript.md b/vi_VN/docs/recipes/typescript.md new file mode 100644 index 00000000..0d3510c9 --- /dev/null +++ b/vi_VN/docs/recipes/typescript.md @@ -0,0 +1,135 @@ +# TypeScript + +Các bản dịch: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/docs/recipes/typescript.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/typescript.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/docs/recipes/typescript.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/docs/recipes/typescript.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/docs/recipes/typescript.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/typescript.md) + +AVA đi kèm với một file định nghĩa TypeScript. Điều này cho phép các nhà phát triển tận dụng TypeScript để viết các bài kiểm tra. + +Hướng dẫn này giả định là bạn đã thiết lập TypeScript cho dự án của mình. Lưu ý rằng định nghĩa của AVA đã được thử nghiệm với phiên bản 2.8.3. + +## Cấu hình AVA để biên dịch các file TypeScript đang di chuyển + +Bạn có thể cấu hình AVA để nhận dạng các file TypeScript. Sau đó, với `ts-node` được cài đặt, bạn có thể biên dịch chúng một cách nhanh chóng: + +```json +{ + "ava": { + "compileEnhancements": false, + "extensions": [ + "ts" + ], + "require": [ + "ts-node/register" + ] + } +} +``` + +Cần lưu ý rằng với các cấu hình này test sẽ thất bại nếu có lỗi build từ TypeScript. Nếu bạn muốn bỏ qua các lỗi này trong khi test, bạn có thể dùng `ts-node/register/transpile-only` thay vì `ts-node/register`. + +## Biên dịch các file TypeScript trước khi chạy AVA + +Thêm một script `test` vào file `package.json`. Nó sẽ biên dịch dự án trước và sau đó chạy AVA. + +```json +{ + "scripts": { + "test": "tsc && ava" + } +} +``` + +Đảm bảo rằng AVA chạy các file TypeScript đã được build của bạn. + +## Viết các test + +Tạo một file `test.ts`. + +```ts +import test from 'ava'; + +const fn = async () => Promise.resolve('foo'); + +test(async (t) => { + t.is(await fn(), 'foo'); +}); +``` + +## Sử dụng [macros](https://github.com/avajs/ava#test-macros) + +Để có thể gán thuộc tính `title` cho macro, bạn cần nhập hàm: + +```ts +import test, {Macro} from 'ava'; + +const macro: Macro = (t, input: string, expected: number) => { + t.is(eval(input), expected); +}; +macro.title = (providedTitle: string, input: string, expected: number) => `${providedTitle} ${input} = ${expected}`.trim(); + +test(macro, '2 + 2', 4); +test(macro, '2 * 3', 6); +test('providedTitle', macro, '3 * 3', 9); +``` + +Bạn sẽ cần một loại khác nếu bạn mong muốn macro của mình được sử dụng với callback test: + +```ts +import test, {CbMacro} from 'ava'; + +const macro: CbMacro = t => { + t.pass(); + setTimeout(t.end, 100); +}; + +test.cb(macro); +``` + +## Typing [`t.context`](https://github.com/avajs/ava#test-context) + +Theo mặc định, kiểu `t.context` sẽ là đối tượng rỗng (`{}`). AVA chìa ra một interface `TestInterface` mà bạn có thể sử dụng để áp dụng kiểu riêng của mình cho `t.context`. Điều này có thể giúp bạn nắm bắt lỗi tại thời gian biên dịch: + +```ts +import anyTest, {TestInterface} from 'ava'; + +const test = anyTest as TestInterface<{foo: string}>; + +test.beforeEach(t => { + t.context = {foo: 'bar'}; +}); + +test.beforeEach(t => { + t.context.foo = 123; // lỗi: Kiểu '123' không thể gán vào kiểu 'string' +}); + +test.serial.cb.failing('very long chains are properly typed', t => { + t.context.fooo = 'a value'; // lỗi: Thuộc tính 'fooo' không tồn tại trên kiểu '' +}); + +test('an actual test', t => { + t.deepEqual(t.context.foo.map(c => c), ['b', 'a', 'r']); // lỗi: Thuộc tính 'map' không tồn tại trên kiểu 'string' +}); +``` + +Bạn cũng có thể nhập ngữ cảnh khi tạo macro: + +```ts +import anyTest, {Macro, TestInterface} from 'ava'; + +interface Context { + foo: string +} + +const test = anyTest as TestInterface; + +const macro: Macro = (t, expected: string) => { + t.is(t.context.foo, expected); +}; + +test.beforeEach(t => { + t.context = {foo: 'bar'}; +}); + +test('foo is bar', macro, 'bar'); +``` + +Lưu ý rằng, mặc dù kiểu được truyền ở trên, khi thực thi `t.context` là một đối tượng rỗng trừ khi nó được gán. diff --git a/vi_VN/docs/recipes/vue.md b/vi_VN/docs/recipes/vue.md new file mode 100644 index 00000000..35cc4ca9 --- /dev/null +++ b/vi_VN/docs/recipes/vue.md @@ -0,0 +1,77 @@ +# Test các component của Vue.js + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/vue.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/vue.md) + +## Các dependency + +- [Cần các hook mở rộng](https://github.com/jackmellis/require-extension-hooks): + - `npm i --save-dev require-extension-hooks require-extension-hooks-vue require-extension-hooks-babel` + +- [browser-env](browser-testing.md) + - `npm i --save-dev browser-env` + +## Cài đặt + +Bước đầu tiên là bạn phải thiết lập một helper giúp cấu hình môi trường để transpile các file `.vue` và chạy trong một môi trường như browser: + +`package.json` + +```json +{ + "ava": { + "require": [ + "./test/helpers/setup.js" + ] + } +} +``` + +```js +// ./test/helpers/setup.js + +// Cài đặt môi trường browser +require('browser-env')(); +const hooks = require('require-extension-hooks'); +const Vue = require('vue'); + +// Mẹo thiết lập Vue.js để loại bỏ production +Vue.config.productionTip = false; + +// Thiết lập các file vue được xử lý bởi`require-extension-hooks-vue` +hooks('vue').plugin('vue').push(); +// Cài đặt các file vue và js để xử lý bởi `require-extension-hooks-babel` +hooks(['vue', 'js']).plugin('babel').push(); +``` + +Bạn có thể tìm thêm nhiều thông tin về việc thiết lập Babel với AVA trong [Công thức Babel](babel.md). + +## Test snapshot đơn giản + +```js +import test from 'ava'; +import Vue from 'vue'; +import Component from 'component.vue'; + +test('renders', t => { + const vm = new Vue(Component).$mount(); + const tree = { + $el: vm.$el.outerHTML + }; + t.snapshot(tree); +}); +``` + +## Báo cáo Coverage + +Thực hiện theo [công thức báo cáo coverage](code-coverage.md), bổ sung thêm phần mở rộng `.vue` vào cấu hình `nyc` của tập tin `.vue`. + +```json +{ + "nyc": { + "extension": [ + ".js", + ".vue" + ] + } +} +``` diff --git a/vi_VN/docs/recipes/watch-mode.md b/vi_VN/docs/recipes/watch-mode.md new file mode 100644 index 00000000..e79a8c29 --- /dev/null +++ b/vi_VN/docs/recipes/watch-mode.md @@ -0,0 +1,121 @@ +# Chế độ theo dõi + +Các bản dịch: [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/watch-mode.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/docs/recipes/watch-mode.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/docs/recipes/watch-mode.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/docs/recipes/watch-mode.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/watch-mode.md) + +AVA đi kèm với chế độ theo dõi thông minh. Nó sẽ theo dõi sự thay đổi của các file và chỉ chạy test của các file có sự ảnh hưởng. + +## Chạy test với chế độ theo dõi được bật + +Bạn có thể bật chế độ theo dõi bằng cách sử dụng các cờ `--watch` hoặc `-w`. Nếu bạn đã cài đặt AVA toàn cục: + +```console +$ ava --watch +``` + +Nếu bạn đã cấu hình nó trong `package.json` như thế này: + +```json +{ + "scripts": { + "test": "ava" + } +} +``` + +Bạn có thể chạy: + +```console +$ npm test -- --watch +``` + +Bạn cũng có thể thiết lập một lệnh đặc biệt: + +```json +{ + "scripts": { + "test": "ava", + "watch:test": "ava --watch" + } +} +``` + +Và sau đó dùng: + +```console +$ npm run watch:test +``` + +Cuối cùng, bạn có thể định cấu hình AVA thành *luôn* chạy trong chế độ theo dõi bằng cách đặt khóa `watch` trong [`ava` của file `package.json`, hoặc `ava.config.js`][cấu hình]: + +```json +{ + "ava": { + "watch": true + } +} +``` + +Hãy lưu ý rằng TAP reporter không khả dụng khi sử dụng chế độ theo dõi. + +## Các yêu cầu + +AVA sử dụng [`chokidar`] làm trình theo dõi file. Lưu ý rằng ngay cả khi bạn thấy cảnh báo về các dependency bị lỗi cài đặt, nó vẫn sẽ hoạt động tốt. Vui lòng tham khảo phần *[Install Troubleshooting]* của tài liệu `chokidar` để biết cách giải quyết các vấn đề cài đặt với chokidar. + +## Các file source và file test + +Trong AVA, có sự phân biệt giữa *file source* và *file test*. Bạn có thể tưởng tượng *các file test* chứa các test kiểm tra của bạn. *Các file source* là tất cả các file cần thiết để cho các test có thể chạy, có thể là mã nguồn của bạn hoặc các thử nghiệm test. + +Theo mặc định, AVA theo dõi các thay đổi đối với các file test, các file snapshot, `package.json`, và các file `.js` khác. Nó sẽ bỏ qua các file trong [các thư mục nhất định](https://github.com/novemberborn/ignore-by-default/blob/master/index.js) như đã được cung cấp bởi package [`ignore-by-default`]. + +Bạn có thể cấu hình các pattern cho các file source trong [phần `ava` của file `package.json`, hoặc `ava.config.js`][config], sử dụng khóa `sources`. + +Bạn có thể chỉ định các pattern để khớp với các file trong các thư mục mà nếu không chúng sẽ bị bỏ qua, ví dụ: sử dụng `node_modules/some-dependency/*.js` để chỉ định tất cả các tệp `.js` trong `node_modules/some-dependency` như là nguồn, mặc dù thông thường tất cả các tệp trong `node_modules` đều bị bỏ qua. Lưu ý rằng bạn cần chỉ định một thư mục chính xác; `{bower_components,node_modules}/**/*.js` sẽ không hoặt động. + +Nếu các test của bạn ghi vào đĩa, chúng có thể kích hoạt trình giám sát chạy lại các thử nghiệm của bạn. Định cấu hình các pattern cho các file source để tránh điều này. + +## Theo dõi dependency + +AVA theo dõi các file source mà các file test của bạn phụ thuộc vào. Nếu bạn thay đổi một dependency thì chỉ có file test phụ thuộc vào nó sẽ chạy lại. AVA sẽ chạy lại tất cả các test nếu nó không thể xác định được file test nào phụ thuộc vào file source đã thay đổi. + +Theo dõi sự phụ thuộc của dependency hoạt động cho các module bắt buộc. Các phần mở rộng tùy chỉnh và các transpiler được hỗ trợ, miễn là bạn [đã thêm chúng vào file `package.json` hoặc `ava.config.js`][config], chứ không phải từ bên trong file test của bạn. Các file được truy cập bằng module `fs` không được theo dõi. + +## Chế độ theo dõi và modifier `.only` + +[Modifier `.only`] vô hiệu hóa thuật toán theo dõi denpendency của chế độ theo dõi. Khi thay đổi được thực hiện, tất cả các test `.only` sẽ chạy lại, bất kể test có phụ thuộc vào file đã thay đổi hay không. + +## Chế độ theo dõi và CI + +Nếu bạn chạy AVA trong CI với chế độ theo dõi, việc thực hiện sẽ thoát với một lỗi (`Lỗi: Chế độ theo dõi không khả dụng trong CI, vì nó ngăn AVA không thể kết thúc.`). AVA sẽ không chạy với tùy chọn `--watch` (`-w`) trong CI, bởi vì các quá trình CI sẽ kết thúc, và với tùy chọn `--watch`, AVA sẽ không bao giờ kết thúc được. + +## Trả về tất cả test bằng cách thủ công + +Bạn có thể nhanh chóng chạy lại tất cả các test bằng cách gõ r trên console, theo sau là Enter. + +## Cập nhật các snapshot + +Bạn có thể cập nhật các snapshot không thành công bằng cách gõ u trên console, theo sau là Enter. + +## Gỡ lỗi + +Đôi khi chế độ theo dõi có thể làm vài điều ngạc nhiên như chạy lại tất cả các test khi bạn nghĩ chỉ có một test duy nhất sẽ được chạy. Để xem lý do, bạn có thể bật chế độ gỡ lỗi. Điều này sẽ làm việc tốt nhất với các báo cáo chi tiết: + +```console +$ DEBUG=ava:watcher npm test -- --watch --verbose +``` + +Trên Windows dùng: + +```console +$ set DEBUG=ava:watcher +$ npm test -- --watch --verbose +``` + +## Giúp chúng tôi cải thiện chế độ theo dõi + +Chế độ theo dõi là tương đối mới và có thể có một số lỗi. Hãy [báo cáo](https://github.com/avajs/ava/issues) bất kì vấn đề nào bạn gặp phải. Xin cảm ơn! + +[`chokidar`]: https://github.com/paulmillr/chokidar +[Install Troubleshooting]: https://github.com/paulmillr/chokidar#install-troubleshooting +[`ignore-by-default`]: https://github.com/novemberborn/ignore-by-default +[`.only` modifier]: https://github.com/avajs/ava#running-specific-tests +[config]: https://github.com/avajs/ava#configuration diff --git a/vi_VN/docs/recipes/when-to-use-plan.md b/vi_VN/docs/recipes/when-to-use-plan.md new file mode 100644 index 00000000..e7444e68 --- /dev/null +++ b/vi_VN/docs/recipes/when-to-use-plan.md @@ -0,0 +1,142 @@ +# Khi nào sử dụng `t.plan()` + +Các bản dịch: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/docs/recipes/when-to-use-plan.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/docs/recipes/when-to-use-plan.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/docs/recipes/when-to-use-plan.md), [日本語](https://github.com/avajs/ava-docs/blob/master/ja_JP/docs/recipes/when-to-use-plan.md), [Português](https://github.com/avajs/ava-docs/blob/master/pt_BR/docs/recipes/when-to-use-plan.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/docs/recipes/when-to-use-plan.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/docs/recipes/when-to-use-plan.md), [Tiếng việt](https://github.com/avajs/ava-docs/blob/master/vi_VN/docs/recipes/when-to-use-plan.md) + +Một sự khác biệt lớn giữa AVA và [`tap`](https://github.com/tapjs/node-tap)/[`tape`](https://github.com/substack/tape) là hành vi của `t.plan()`. Trong AVA, `t.plan()` chỉ được sử dụng để khẳng định rằng số lượng các xác nhận dự kiến được gọi; nó không tự động kết thúc test. + +## Những cách sử dụng sai của `t.plan()` + +Rất nhiều người dùng chuyển từ `tap`/`tape` đã quen với việc sử dụng `t.plan()` trong tất cả các test. Tuy nhiên, trong AVA, chúng tôi không coi đó là một "thói quen tốt". Thay vào đó, chúng tôi tin rằng `t.plan()` chỉ nên được dùng trong các tính huống mà nó mang lại một số giá trị. + +### Test đồng bộ không phân nhánh + +`t.plan()` là không cần thiết trong hầu hết các test đồng bộ. + +```js +test('simple sums', t => { + // Không tốt: không có sự phân nhánh ở đây - t.plan() là vô nghĩa + t.plan(2); + + t.is(1 + 1, 2); + t.is(2 + 2, 4); +}); +``` + +`t.plan()` không cung cấp bất kỳ giá trị nào ở đây và tạo thêm một công việc vặt nếu bạn quyết định thêm hoặc xóa các xác nhận giá trị. + +### Các promise được mong đợi là sẽ resolve + +```js +test('gives foo', t => { + t.plan(1); + + return somePromise().then(result => { + t.is(result, 'foo'); + }); +}); +``` + +Thoạt nhìn, các bài kiểm tra này dường như sử dụng tốt `t.plan()` ví nó có một trình sử lý promise không đồng bộ. Tuy nhiên, có một số vấn đề với test: + +1. `t.plan()` có lẽ được sử dụng ở đây để bảo vệ khả năng `somePromise()` có thể bị reject; Nhưng việc trả về một promise bị reject cũng sẽ làm test bị bất bại. + +2. Sẽ tốt hơn nếu tận dụng lợi thế của `async`/`await`: + +```js +test('gives foo', async t => { + t.is(await somePromise(), 'foo'); +}); +``` + +### Các promise với một khối `.catch()` + +```js +test('rejects with foo', t => { + t.plan(2); + + return shouldRejectWithFoo().catch(reason => { + t.is(reason.message, 'Hello'); + t.is(reason.foo, 'bar'); + }); +}); +``` + +Ở đây, việc sử dụng `t.plan()` tìm cách đảm bảo rằng code bên trong khối `catch` được thực thi. +Thay vào đó, bạn nên tận dụng `t.throwsAsync` và `async`/`await`, vì điều này dẫn đến code rõ ràng và dễ hiểu hơn: + +```js +test('rejects with foo', async t => { + const reason = await t.throwsAsync(shouldRejectWithFoo()); + t.is(reason.message, 'Hello'); + t.is(reason.foo, 'bar'); +}); +``` + +### Đảm bảo lệnh catch xảy ra + +```js +test('throws', t => { + t.plan(2); + + try { + shouldThrow(); + } catch (err) { + t.is(err.message, 'Hello'); + t.is(err.foo, 'bar'); + } +}); +``` + +Như đã nêu trong ví dụ trước, việc sử dụng xác nhận `t.throws()` với `async`/`await` là một lựa chọn tốt hơn. + +## Cách sử dụng tốt của `t.plan()` + +`t.plan()` cung cấp giá trị trong các trường hợp sau. + +### Đảm bảo nhiều callback thực sự được gọi + +```js +test.cb('invokes callbacks', t => { + t.plan(2); + + const callbackA = () => { + t.pass(); + t.end(); + }; + + const callbackB = () => t.pass(); + + bThenA(callbackA, callbackB); +}); +``` + +Đoạn code trên đảm bảo rằng `callbackB` được gọi đầu tiên (và chỉ một lần), tiếp theo là `callbackA`. Bất kỳ trường hợp nào khác sẽ không làm thỏa mãn kế hoạch. + +### Test với các lệnh phân nhánh + +Trong hầu hết các trường hợp, bạn nên sử dụng bất kỳ sự phân nhánh phức tạp nào trong các test của mình. Một ngoại lệ đáng chú ý là cho các test được tự động (có lẽ từ một tài liệu JSON). Bên dưới `t.plan()` được sử dụng để đảm bảo tính chính xác của đầu vào JSON. + +```js +const testData = require('./fixtures/test-definitions.json'); + +for (const testDefinition of testData) { + test('foo or bar', t => { + const result = functionUnderTest(testDefinition.input); + + // testDefinition phải có một kỳ vọng cho `foo` hoặc `bar` nhưng không phải là cả 2 + t.plan(1); + + if (testDefinition.foo) { + t.is(result.foo, testDefinition.foo); + } + + if (testDefinition.bar) { + t.is(result.bar, testDefinition.foo); + } + }); +} +``` + +## Kết luận + +`t.plan()` có nhiều cách sử dụng hợp lệ, nhưng nó không nên được sử dụng bừa bãi. Một nguyên tắc chung là nên sử dụng nó bất kỳ lúc nào *test* của bạn không đơn giản, dễ dàng giải thích, flow của code. Các test với xác nhận bên trong callback, lệnh `if`/`then`, `for`/`while`, và (trong một số trường hợp) các khối `try`/`catch` , là tất cả các ứng cử viên tốt cho `t.plan()`. diff --git a/vi_VN/readme.md b/vi_VN/readme.md index 7c849d24..d95f6ca7 100644 --- a/vi_VN/readme.md +++ b/vi_VN/readme.md @@ -180,7 +180,7 @@ $ ava --help Các thư mục được đệ quy, tất cả các file có đuôi `*.js` sẽ được xem như là file test. Các thư mục có tên `fixtures`, `helpers` và `node_modules` sẽ *luôn* bị bỏ qua. Các file có tên bắt đầu bằng `_` sẽ cho phép bạn đặt những helper code trong cùng thư mục với file test của bạn. -Khi sử dụng lệnh `npm test`, bạn có thể truyền vào trực tiếp các tham số để chỉ rõ file cần test `npm test test2.js`, nhưng các tham số nên được truyền vào như sau `npm test -- --verbose`. +Khi sử dụng lệnh `npm test`, bạn có thể truyền vào trực tiếp các tham số để chỉ rõ file cần test `npm test test2.js`, nhưng các cờ nên được truyền vào như sau `npm test -- --verbose`. ## Kiểm lỗi @@ -208,13 +208,13 @@ Báo cáo mini là báo cáo mặc định. ### Báo cáo chi tiết -Dùng tham số `--verbose` để kích hoạt báo cáo chi tiết. Báo cáo chi tiết sẽ luôn được dùng trong môi trường CI, trừ khi [Báo cáo TAP](#tap-reporter) đã được kích hoạt. +Dùng cờ `--verbose` để kích hoạt báo cáo chi tiết. Báo cáo chi tiết sẽ luôn được dùng trong môi trường CI, trừ khi [Báo cáo TAP](#tap-reporter) đã được kích hoạt. ### Báo cáo TAP -AVA hỗ trợ định dạng TAP và do đó tương thích với [Bất kì báo cáo TAP nào khác](https://github.com/sindresorhus/awesome-tap#reporters). Sử dụng tham số `--tap` để bật báo cáo TAP. +AVA hỗ trợ định dạng TAP và do đó tương thích với [Bất kì báo cáo TAP nào khác](https://github.com/sindresorhus/awesome-tap#reporters). Sử dụng cờ `--tap` để bật báo cáo TAP. ```console $ ava --tap | tap-nyan @@ -422,7 +422,7 @@ test.serial('passes serially', t => { }); ``` -Lưu ý rằng điều này chỉ áp dụng cho các test trong một file test nhất định. AVA vẫn sẽ chạy nhiều file test cùng lúc trừ khi bạn truyền vào tham số [`--serial` CLI flag](#cli). +Lưu ý rằng điều này chỉ áp dụng cho các test trong một file test nhất định. AVA vẫn sẽ chạy nhiều file test cùng lúc trừ khi bạn truyền vào cờ [`--serial` CLI flag](#cli). Bạn có thể sử dụng `.serial` với tất cả các test, hook hoặc tập chí `.todo()`, nhưng nó chỉ có sẵn trên hàm `test`. @@ -446,7 +446,7 @@ Bạn có thể sử dụng `.only` với tất cả các test. Nó không thể ### Thực thi test với các tiêu đề trùng khớp -Tham số `--match` cho phép bạn chạy các test có tiêu đề trùng khớp, Điều này có thể thực hiện bằng cách sử dụng một wildcard patterns đơn giản. Các pattern không phân biệt chữ hoa thường. Xem [`matcher`](https://github.com/sindresorhus/matcher) để có thêm thông tin. +Cờ `--match` cho phép bạn chạy các test có tiêu đề trùng khớp, Điều này có thể thực hiện bằng cách sử dụng một wildcard patterns đơn giản. Các pattern không phân biệt chữ hoa thường. Xem [`matcher`](https://github.com/sindresorhus/matcher) để có thêm thông tin. Các tiêu đề kết thúc với `foo`: @@ -1111,7 +1111,7 @@ AVA sẽ hiển thị lý do tại sao xác nhận snapshot thất bại: -Sau đó, bạn có thể kiểm tra code của mình, Nếu thay đổi là cố ý, bạn có thể dùng tham số `--update-snapshots` (hoặc `-u`) để cập nhật các snapshot: +Sau đó, bạn có thể kiểm tra code của mình, Nếu thay đổi là cố ý, bạn có thể dùng cờ `--update-snapshots` (hoặc `-u`) để cập nhật các snapshot: ```console $ ava --update-snapshots @@ -1214,7 +1214,7 @@ Mocha yêu cầu bạn phải sử dụng các cấu hình toàn cục như `des Tape và tap cũng khá là tốt. AVA được lấy cảm hứng từ cú pháp của chúng. Chúng cũng thực hiện các bài kiểm tra một cách tuần tự. Nhưng đầu ra mặc định [TAP](https://testanything.org) của chúng lại không thân thiện với người dùng, do vậy bạn luôn phải sử dụng các tap reporter khác. -Ngược lại, AVA được đánh giá cao và nó chạy các test một cách đồng thời, với một process độc lập cho mỗi file test. Reporter mặc định của AVA rất dễ đọc và không dừng lại ở đó AVA còn hỗ trợ TAP output thông qua tham số CLI. +Ngược lại, AVA được đánh giá cao và nó chạy các test một cách đồng thời, với một process độc lập cho mỗi file test. Reporter mặc định của AVA rất dễ đọc và không dừng lại ở đó AVA còn hỗ trợ TAP output thông qua cờ CLI. ### Tên project được viết và đọc như thế nào? From 66aaf4f443121f0ae7ddd2b658e90842a35ad63d Mon Sep 17 00:00:00 2001 From: Kyoz Date: Mon, 30 Jul 2018 09:34:08 +0700 Subject: [PATCH 7/7] Restore the original description of CLI helper --- vi_VN/readme.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/vi_VN/readme.md b/vi_VN/readme.md index d95f6ca7..e14f4d60 100644 --- a/vi_VN/readme.md +++ b/vi_VN/readme.md @@ -150,29 +150,29 @@ AVA hỗ trợ các bản release mới nhất của bất kì phiên bản chí ```console $ ava --help - Cách dùng + Usage (Cách dùng) ava [ ...] - Các tùy chọn - --watch, -w Chạy lại test khi test và file test có sự thay đổi - --match, -m Chỉ chạy test với các tiêu đề phù hợp (Có thể lặp lại) - --update-snapshots, -u Cập nhật các snapshot - --fail-fast Dừng ngay khi test đầu tiên thất bại - --timeout, -T Thiết lập thời gian timeout toàn cục - --serial, -s Chạy các test theo từng kỳ - --concurrency, -c Số test tối đa cùng chạy ở một thời điểm (Mặc định: Số nhân của CPU) - --verbose, -v Hiển thị chi tiết các output - --tap, -t Tạo TAP output - --color Màu của output - --no-color Vô hiệu hóa màu cho output - - Ví dụ + Options (Các tùy chọn) + --watch, -w Re-run tests when tests and source files change (Chạy lại test khi test và file test có sự thay đổi) + --match, -m Only run tests with matching title (Can be repeated) (Chỉ chạy test với các tiêu đề phù hợp (Có thể lặp lại)) + --update-snapshots, -u Update all snapshots (Cập nhật các snapshot) + --fail-fast Stop after first test failure (Dừng ngay khi test đầu tiên thất bại) + --timeout, -T Set global timeout (Thiết lập thời gian timeout toàn cục) + --serial, -s Run tests serially (Chạy các test theo từng kỳ) + --concurrency, -c Max number of test files running at the same time (Default: CPU cores) (Số test tối đa cùng chạy ở một thời điểm (Mặc định: Số nhân của CPU)) + --verbose, -v Enable verbose output (Hiển thị output chi tiết) + --tap, -t Generate TAP output (Tạo TAP output) + --color Force color output (Màu của output) + --no-color Disable color output (Vô hiệu hóa màu cho output) + + Examples (Ví dụ) ava ava test.js test2.js ava test-*.js ava test - Pattern mặc định khi không có tham số: + Default patterns when no arguments (Pattern mặc định khi không có tham số): test.js test-*.js test/**/*.js **/__tests__/**/*.js **/*.test.js ```