January 9, 2016

Sinon - Solved method already wrapped

source: http://cdn.dev.classmethod.jp/wp-content/uploads/2012/03/sinonjs.png
Dạo gần đây do một số nhu cầu nên phải lấn sâu làm việc với mấy anh chàng JS. Từ backend (NodeJS) đến frontend, mà vốn dĩ ưa thích cái phong cách TDD, nên giờ code gì cũng lôi TDD vào mà mần. Đồng đạo có thễ xem lại bài hướng dẫn testing với JS tại đây

Trong lúc mần ăn với TDD JS thì gặp phải tình huống mock một đối tượng và bị báo lỗi "already wrapped". Mần mò một khoảng thời gian, từ google đến stackoverflow rồi thì cũng giải quyết được cái vấn đề này. Hôm nay, có tí thời gian viết bài blog chia sẻ tới mọi người.

Tình huống gặp phải


Mình dùng MongoDB làm model, rồi sinon làm test. Và đoạn test ban đầu thế này

Đoạn code bên trên chỉ là một đoạn demo, ý muốn nói là mình có 2 method và cùng gọi qua method Update của Mongoose. Và khi chạy test (mình dùng mocha) thì gặp ngay tình huống như sau:


Loay hoay 1 hồi thì tạm hiểu là mình đã "mock" đối tượng model ra một lần với method Update rồi, giờ "mock" nữa nó không cho, nó la làng la xóm.

Xử lý tình huống


Google và stackoverflow hồi thì cũng có những người từng gặp tình huống y chang mình. Cách thức cũng đơn giản đó là xử dụng một biến Mock cho mỗi testcase, sau mỗi testcase thì xóa nó đi, để nó tự khởi tạo lại. Ứng dụng cái này thì hẳn ai từng làm qua TDD thì không có gì lạ, đối với mocha thì đó chính là cặp: beforeEach afterEach.

Ok, vậy giờ fix cái này để chạy test ok. Đoạn code được fix như sau:

Bây giờ thì mọi thứ trở nên tốt hơn. Bạn không tin, có thể thử mà ^_^. Hy vọng bài chia sẻ này sẽ giúp các bạn tiết kiệm được thời gian khi gặp cùng tình huống giống như thế này. Cảm ơn đã đọc hết bài

No comments:

Post a Comment