2013-06-27 29 views
6

Tôi có một ứng dụng sử dụng Dịch vụ Góc (https://github.com/PascalPrecht/angular-translate). Dịch hoạt động tốt trong ứng dụng thông qua trình duyệt nhưng khi tôi thử kiểm tra bất kỳ bộ điều khiển nào, tôi nhận được Lỗi: Yêu cầu không mong muốn: GET locale/locale-en.json. Làm thế nào để đơn vị kiểm tra bộ điều khiển của tôi từ khi dịch yêu cầu GET cho tệp ngôn ngữ khi khởi động?Làm cách nào để kiểm tra bộ điều khiển với Angular Translate được khởi tạo trong App Config?

Tôi đang sử dụng trình tạo góc yeoman với Karma.


App.js:

angular.module('myApp', ['ngCookies', 'ui.bootstrap', 'pascalprecht.translate']) 
    .config(function ($routeProvider, $locationProvider, $translateProvider) { 

    $routeProvider 
     .when('/', { 
     templateUrl: 'views/main.html', 
     controller: 'MainCtrl' 
     }) 
     .otherwise({ 
     redirectTo: '/' 
     }); 

     $translateProvider.useStaticFilesLoader({ 
     prefix: 'locale/locale-', 
     suffix: '.json' 
     }); 
     $translateProvider.uses('en'); 
     $translateProvider.useLocalStorage(); 
    }); 

điều khiển kiểm tra:

describe('Controller: DocumentationCtrl', function() { 

    // load the controller's module 
    beforeEach(module('myApp')); 

    var DocumentationCtrl, 
    scope, 
    $httpBackend; 

    // Initialize the controller and a mock scope 
    beforeEach(inject(function ($controller, $rootScope, $injector) { 
    $httpBackend = $injector.get('$httpBackend'); 
    scope = $rootScope.$new(); 
    DocumentationCtrl = $controller('DocumentationCtrl', { 
     $scope: scope 
    }); 
    })); 

    it('should attach a list of awesomeThings to the scope', function() { 
    $httpBackend.whenGET('locale/locale-en.json').respond(200, { 
     "TITLE": 'My App' 
    }); 
    expect(scope.awesomeThings.length).toBe(3); 
    }); 

}); 

Controller Tài liệu chỉ là một tiêu chuẩn được tạo ra bộ điều khiển.

Trả lời

5

Bạn phải chỉ định ngôn ngữ ưa thích trong giai đoạn cấu hình thay vì sau đó là giai đoạn chạy. Vì vậy, $translate.uses('us') trở thành $translateProvider.preferredLanguage('us'). Tương tự với số useLocalStorage(). Đây là tất cả các phương thức để cấu hình dịch vụ $translate.

Bạn cũng nên cố gắng tránh uses() để đặt ngôn ngữ mặc định. Sử dụng preferredLanguage() để thay thế. Lý do là, $translate.uses() cố gắng tải tệp i18n càng sớm càng tốt, nếu có cookie hoặc tương tự sử dụng khóa ngôn ngữ khác, uses() sẽ tải hai tệp, đó là lý do chúng tôi giới thiệu preferredLanguage() Và điều này sẽ giải quyết vấn đề.

+0

Cảm ơn bạn rất nhiều vì câu trả lời. Tôi vẫn không chắc chắn làm thế nào để kiểm tra này mặc dù tôi đã chuyển sang preferredLanguage() vì vậy app.config của tôi trông như thế này: $ translateProvider.useStaticFilesLoader ({ tiền tố: 'locale/locale-', hậu tố: '.json ' }); $ translateProvider.preferredLanguage ('us'); $ translateProvider.useLocalStorage(); – Zacho

+0

Ồ và lỗi xảy ra vì bạn không mong đợi một yêu cầu nhận được http được giải thích. Vì vậy, trong nó() spec của bạn, bạn nên làm một cái gì đó như: $ http.expectGET ('locale/locale-us.json'); Và đừng quên xóa các reponses đang chờ xử lý thông qua $ http.flush(); – PascalPrecht

+0

Tôi nhận được nó hoạt động. Việc sửa chữa là sử dụng preferredLanguage() và ghi đè lên hàm trước khi khởi tạo ứng dụng trong bài kiểm tra đơn vị của tôi. Đây là một ứng dụng khá lớn và tôi không muốn đưa locale expectGET vào mọi thử nghiệm đơn vị. Cảm ơn! – Zacho

1

Tránh khởi tạo mô-đun cấp ứng dụng, đặt bộ điều khiển của bạn trong myApp.controllers và kiểm tra mô-đun này thay thế.

"Chúng tôi khuyên bạn nên chia nhỏ ứng dụng của mình thành nhiều mô-đun. (...) Lý do cho việc chia nhỏ này là trong các thử nghiệm của bạn, thường cần phải bỏ qua mã khởi tạo, có xu hướng khó kiểm tra. "

http://docs.angularjs.org/guide/module

+1

Tôi đã thử nó và nó vẫn có vẻ như là con đường để đi nhưng vấn đề vẫn giữ nguyên với GET/locale/en-us.json bất ngờ. – Zacho

0

Tôi nghĩ rằng bạn có một thứ tự sai: Các thiết lập cho-dịch góc cố gắng để tải đúng ngôn ngữ sau khi gọi uses(lang) (sau khi khối, quả thật vậy).

Chúng tôi gặp sự cố tương tự khi phát triển bộ điều hợp trong dịch chuyển anguluar. Hãy thử xem xét https://github.com/PascalPrecht/angular-translate-loader-url/blob/16e559030bce819e8ca1b82fed7163286b57bafe/test/unit/translateUrlLoaderSpec.js là các thử nghiệm cho plugin trình tải url.

Nếu bộ điều khiển không được tiêm một bước sau đó?

+0

Tôi cũng nghĩ như vậy, tuy nhiên tôi đã thử đặt mục tiêu làGET/whenGET ở một số vị trí khác nhau. Vấn đề tôi nghĩ là những gì bạn có thể tránh né là vấn đề về thịt gà và trứng. Về cơ bản tôi cần phải xác định whenGET trước khi ứng dụng chạy, nhưng ứng dụng cần được khởi tạo trước tiên. Bất kỳ ví dụ nào về cách thực hiện điều đó? Tôi có cần tải bản dịch trong bài kiểm tra của mình trước không, sau đó ứng dụng của tôi? – Zacho