2013-06-26 22 views
32

Khi viết các bài kiểm tra với JasmineJS, tôi có nhiều bài kiểm tra tương tự như beforeEach/afterEach.Làm thế nào để tái sử dụng beforeEach/afterEach trong Jasmine JS?

Có cách nào để triển khai mô hình kế thừa bằng các bộ thử nghiệm JasmineJS không?

Tôi có thể nhóm tất cả các thử nghiệm trong một đơn describe nhưng trong trường hợp này tôi sẽ kết thúc bằng một tệp JS duy nhất có chứa tất cả các thử nghiệm.

Tôi muốn chia các thử nghiệm cho mỗi trang.

Dưới đây là một ví dụ:

describe('Services Page', function() { 

    beforeEach(function() { 
     login_as_admin() 
    }) 

    beforeEach(function() { 
     browser().navigateTo('/services') 
    }) 

    if('Some test for services page', function() {}) 

    afterEach(function() { 
     logout() 
    }) 

}) 


describe('Administrators Page', function() { 

    beforeEach(function() { 
     login_as_admin() 
    }) 

    beforeEach(function() { 
     browser().navigateTo('/administrators') 
    }) 

    if('Some test for administrators page', function() {}) 

    afterEach(function() { 
     logout() 
    }) 

}) 
+1

sẽ mỗi trang có 'login_as_admin()' và 'logout()'? – xst

Trả lời

27

Tôi nghĩ rằng đây là một phần kiểm tra in this blog post và cũng answered here nhưng tôi đang bổ sung thêm một câu trả lời phù hợp ví dụ của bạn:

đang Reusable:

function sharedSetup(startPage) { 
    beforeEach(function() { 
     login_as_admin(); 
     browser().navigateTo(startPage); 
    }); 

    afterEach(function() { 
     logout(); 
    }); 
}; 

Làm thế nào để sử dụng nó:

describe('Services Page', function() { 
    sharedSetup('/services'); 

    it('Some test for services page', function() {}); 
}); 

describe('Administrators Page', function() { 
    sharedSetup('/administrators'); 

    it('Some test for administrators page', function() {}); 
}); 
3

Jasmine không cho phép bạn đặt beforeEachafterEach bên ngoài của một cuộc gọi describe. Bằng cách này bạn có thể thiết lập và teardown đó là toàn cầu cho tất cả các thông số kỹ thuật của bạn. Cuộc gọi logout() của bạn có vẻ như là một ứng cử viên tốt cho việc rách nát toàn cầu và nếu tất cả thông số kỹ thuật của bạn đăng nhập với tư cách quản trị viên, bạn cũng có thể chuyển sang phạm vi toàn cầu.

Đối với những thứ được sử dụng trong một số, nhưng không phải tất cả, thông số kỹ thuật, có phương pháp như login_as_admin() có vẻ như cách tốt nhất để hợp nhất logic đó ở một nơi.

0

tham khảo: (Pivotal Labs Blog:Davis W. Frank)

Ông mô tả thu chức năng chia sẻ trong một hàm được gọi với tham số cho dãy phòng riêng biệt khác nhau. Việc gọi hàm này trong mỗi bộ sẽ thực thi thiết lập/cấu hình chung.

Để tách kiểm tra trên các tệp; tệp có chức năng được chia sẻ có thể được bao gồm trong mỗi trang với thẻ <script> nếu các thử nghiệm dựa trên trình duyệt hoặc bởi một require(...) gần đầu nếu các thử nghiệm dựa trên nút. Sau đó, bạn có thể chạy thử nghiệm một cách độc lập nhưng sử dụng thiết lập được chia sẻ được xác định chỉ một lần.

12

Nếu bạn muốn thực hiện điều này cho tất cả các suite của mình, bạn có thể đăng ký một hàm beforeEach hoặc afterEach trong topSuite:

jasmine.getEnv().topSuite().beforeEach({fn: function() { 
    //log in as admin 
}}); 

Nếu bạn chỉ muốn áp dụng nó trên một số dãy phòng, bạn có thể làm việc với phụ suites:

describe("as_admin", function() { 
    beforeEach(function() { 
    //log in as admin 
    }); 

    describe('Services Page',function() {...}); 
    describe('Administrators Page',function() {...}); 

} 
+0

Tôi nghĩ rằng cũng có thể sử dụng: jasmine.getEnv(). BeforeEach (function() { // đăng nhập với tư cách quản trị }); dựa trên các thử nghiệm được bao gồm trong các thay đổi tại đây: https://github.com/jasmine/jasmine/issues/811 – rajsite

+0

Có vẻ như điều quan trọng là gọi 'done()' callback trong 'beforeEach' khi nó bị treo mà không có nó. – Vanuan

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