2011-12-20 23 views
7

Tôi có plugin tự động hoàn thành javascript sử dụng các lớp sau (được viết bằng coffeescript): Truy vấn, Đề xuất, Đề xuấtCollection và Tự động điền. Mỗi lớp trong số này có một đặc tả liên quan được viết bằng Jasmine.Cách hiển thị đối tượng javascript để kiểm tra đơn vị mà không gây ô nhiễm không gian tên chung

Plugin được định nghĩa trong một module, ví dụ:

(function(){ 
    // plugin... 
}).call(this); 

Điều này ngăn cản các lớp từ ô nhiễm không gian tên toàn cầu, mà còn ẩn chúng từ bất kỳ xét nghiệm (thông số kỹ thuật với hoa nhài, hoặc đơn vị xét nghiệm với cái gì đó như q-đơn vị).

Cách tốt nhất để hiển thị các lớp hoặc đối tượng javascript để thử nghiệm mà không gây ô nhiễm không gian tên chung là gì?

Tôi sẽ trả lời bằng giải pháp mà tôi đã đưa ra, nhưng tôi hy vọng rằng có điều gì đó chuẩn hơn.

Cập nhật: Đã cố gắng Giải pháp của tôi

Bởi vì tôi là một newb với < 100 xp, tôi không thể trả lời câu hỏi của riêng tôi trong 8 giờ. Thay vì chờ đợi tôi sẽ chỉ thêm những gì tôi đã làm ở đây.

Để xác định các lớp này, tôi đã phát minh ra một đối tượng toàn cầu có tên là _test mà tôi đã phơi bày tất cả các lớp trong để kiểm tra. Ví dụ, trong coffeescript:

class Query 
    // ... 

class Suggestion 
    // ... 

// Use the classes 

// Expose the classes for testing 
window._test = { 
    Query: Query 
    Suggestion: Suggestion 
} 

Bên trong thông số kỹ thuật của tôi, sau đó, tôi có thể tiết lộ lớp tôi là thử nghiệm:

Query = window._test.Query 

describe 'Query', -> 
    // ... 

này có ưu điểm là chỉ đối tượng _test là bị ô nhiễm, và nó không chắc nó sẽ va chạm với định nghĩa khác của đối tượng này. Tuy nhiên, nó vẫn không sạch sẽ như tôi muốn. Tôi hy vọng một người nào đó sẽ cung cấp một giải pháp tốt hơn.

+0

lẽ phơi bày một số biến nội bộ, chỉ? Ví dụ: 'window.exposedVars = this' (bên trong đóng)? –

+0

Tôi vừa thêm giải pháp đề xuất của tôi một vài giây sau khi bạn đăng bài này. Nó có nằm dọc theo những gì bạn đang đề xuất không? – Mitch

+0

Plugin của bạn hữu ích như thế nào và vẫn không thêm bất kỳ thứ gì vào không gian tên chung? Tôi thực sự tò mò, có lẽ bạn đang làm một cái gì đó tôi không biết. Theo như tôi có thể nói, luôn có ít nhất một đối tượng được đưa vào không gian tên chung. –

Trả lời

3

Tôi nghĩ rằng một cái gì đó giống như hệ thống mô-đun CommonJS (như được sử dụng bởi brunch, ví dụ) sẽ hoạt động.

Bạn có thể tách mã của mình thành các mô-đun và các phần cần chúng sẽ nhập chúng qua require. Phần duy nhất bị "ô nhiễm" là bản đồ mô-đun được duy trì bởi mã quản lý mô-đun, rất giống với đối tượng test của bạn.

Trong Autocomplete.coffee

class exports.Query 
// ... 

class exports.Suggestion 
// ... 

và sau đó trong Autocomplete.spec.coffee

{Query, Suggestion} = require 'app/models/Autocomplete' 

describe 'Query', -> 
+0

Thú vị. Tôi đã không nhìn vào hệ thống này trước đây. Tôi cho rằng nó khá giống với bản chất của những gì tôi đã làm. Tuy nhiên, đối với một plugin có trọng lượng nhẹ mà bạn muốn chia sẻ với người khác, tôi không chắc tôi có muốn ném toàn bộ hệ thống quản lý mô-đun hay không. Tuy nhiên, trang brunch là một đọc tốt, có liên quan. – Mitch

Các vấn đề liên quan