it-swarm.dev

الاستهزاء بوحدة وحدة AngularJS في اختبارات وحدة الياسمين

أحاول وحدة اختبار رمز وحدة التحكم داخل وحدة نمطية تأخذ وحدات أخرى كتبعيات ، لكن لم أتمكن من معرفة كيفية السخرية منها بشكل صحيح.

أنا أستخدم إطار الياسمين وأجري اختباراتي مع Karma (Testacular).

رمز الوحدة النمطية

var app = angular.module('events', ['af.widgets', 'angular-table']);

app.controller('eventsCtrl', function([dependencies]){
    $scope.events = [];
    ...
});

كود المواصفات

describe('events module', function(){
    var $scope,
        ctrl;

    beforeEach(function(){
        angular.mock.module('af.widgets', []);
        angular.mock.module('angular-table', []);
        module('events', ['af.widgets', 'angular-table']);
    });

    beforeEach(inject(function($rootScope, $controller){
        $scope = $rootScope.new();
        ctrl = $controller('NameCtrl', {
            $scope: $scope,
        });
    }));

    it('should have an empty events array', function(){
        expect($scope.events).toBe([]);
    })
});

الخطأ الذي أحصل عليه هو أن Karma هو "no module af.widgets" ، لذلك من الواضح أنني لا أسخر من تبعيات الوحدة النمطية بشكل صحيح. أي تلميحات؟

71
fscof

إذا كنت تريد الاستهزاء بوحدة تعلن عن خدمة أو أكثر ، فقد استخدمت هذا الرمز:

beforeEach(function(){
    module('moduleToMock');
    module(function ($provide) {
        $provide.value('yourService', serviceMock);
    });
});

يعد هذا مفيدًا إذا كانت الخدمة التي تريد الاستهزاء بها هي أيضًا خدمة ترغب في اختبار وحدة (في وصف ياسمين آخر). الحل المقترح من fscof جيد لكن لا يمكنك إنشاء اختبار وحدة لوحدة angular-table.

64
Davide Icardi

إليك ما اكتشفته:

لم أقم بتحميل أي وحدات "جدول جانبي" في ملف karma.conf.js ، وبالتالي الخطأ. كان هذا مقصودًا في البداية لأنني أردت اختبار وحدة "الأحداث" بدون وحدة الجدول الفعلية.

تمكنت من الاستهزاء بوحدة "الجدول الزاوي" بسهولة عن طريق إنشاء ملف جديد في مجلد الاختبار الخاص بي يسمى "mocks/angular-table.js" وأضفت الكود التالي:

/mocks/angular-table.js

'use-strict';
angular.module('angular-table', []);

لقد أضفت هذا الملف إلى ملف karma.conf.js ، مع وحدة "الأحداث" الحقيقية التي أردت اختبارها:

karma.conf.js

...
files = [
    JASMINE,
    JASMINE_ADAPTER,
    'scripts/libs/angular.js',
    'scripts/libs/angular-mocks.js',
    'scripts/events.js', // this is the real module.
    'scripts/mocks/*.js', //loads all custom mocks.
    'scripts/specs/*.spec.js' // loads my spec file.
] 
...

أخيرًا في ملف المواصفات الخاص بي ، تمكنت من إضافة كلتا الوحدتين عن طريق الاتصال بهما بشكل منفصل في كتلة beforeEach:

المواصفات/events.spec.js

beforeEach(function(){
    module('angular-table');
    module('events');
});

حصلت على فكرة لتنظيم ملفاتي بهذه الطريقة من هذا المنشور

46
fscof

لقد قمت مؤخرًا بإصدار ngImprovedTesting الذي يجب أن يجعل إجراء الاختبارات الوهمية بطريقة AngularJS أسهل.

في حالتك ، استخدم فقط ما يلي في اختبار الياسمين:

beforeEach(ModuleBuilder.forModule('events').serviceWithMocks('eventsCtrl').build());

لمزيد من المعلومات حول ngImprovedTesting ، تحقق من منشور المدونة التمهيدية: http://blog.jdriven.com/2014/07/ng-improved-tocking-mock-testing-for-angularjs-made-easy/

3
Emil van Galen