2017-07-16 58 views
2

有谁知道如何在路由组件中单元测试解析块项目?如果有人可以在解析块中测试courseDetails作为示例,那将是非常好的。单元测试解决角度组件中的块

(function() { 
    'use strict'; 

    angular 
     .module('writingsolutionsComponents') 
     .component('courseSettings', { 
      bindings: { 
       newCourseForm: '<', 
       courseDetails: '<', 
       timezones: '<', 
       citations: '<', 
       disciplines: '<' 
      }, 
      templateUrl: 'course-settings/course-settings.html', 
      controller: 'CourseSettingsController' 
     }) 
     .config(stateConfig); 

    stateConfig.$inject = ['$stateProvider']; 

    function stateConfig($stateProvider, $urlRouterProvider) { 
     $stateProvider.state('course-settings', { 
      parent: 'app', 
      url: '/:courseId/course-settings', 
      data: { 
       pageTitle: "Hello World" 
      }, 
      views: { 
       '[email protected]': { 
        component: 'courseSettings' 
       } 
      }, 
      resolve: { 
       courseDetails: function(CourseService, $stateParams) { 
        return CourseService.get($stateParams.courseId); 
       }, 
       timezones: function(TimezoneService) { 
        return TimezoneService.getTimeZones(); 
       }, 
       citations: function(CitationService) { 
        return CitationService.getCitations(); 
       }, 
       disciplines: function(DisciplineService) { 
        return DisciplineService.getAllDisciplines(); 
       } 


       } 
      } 
     }); 
    } 
})(); 

我试过了,它没有为我锻炼。

CourseServiceMock = { 
    get: function() { 
     return $q.resolve({courseId: "32432535",              title: "Communication"}); 
    } 
    }; 
    spyOn(CourseServiceMock , 'get').and.callThrough(); 

    expect(CourseServiceMock .get).toHaveBeenCalled() 
+0

[Test Angular resolve method]的可能重复(https://stackoverflow.com/questions/37278543/test-angular-resolve-method) – estus

回答

1

不测试你的框架。这意味着不要测试ui-router,这是众所周知的正常工作。具体而言,我们知道它将调用已注册的解析函数。

如果你想测试解析函数本身,它实际上很简单。我们只需要使该功能可用于测试。我们实际上可以测试此功能,而无需启动Web浏览器或做任何事情。

这是一个使用名为蓝色磁带 *的测试库*使用NodeJS运行测试的示例,如果必须,您可以将其调整为使用Jasmine。

// tests.js 
const test = require("blue-tape"); 

test("courseDetails resolve retrieves the course based on route/:courseId", async t => { 
    // arrange 
    const courses = [{courseId: "32432535", title: "Communication"}]; 
    const mockCourseService = { 
    get(id) { 
     return Promise.resolve(courses.find(course => course.id === id)); 
    } 
    }; 
    const mock$stateParams = {courseId: "32432535"}; 

    // act 
    const result = await courseDetails(mockCourseService, mock$stateParams); 

    // assert 
    t.equal(result.courseId, courses[0].courseId); 
}); 

得到这个工作,运行

npm install --save-dev blue-tape 

然后运行

node test.js 

的好处是,你的测试不依赖UI路由器甚至AngularJS上它只是测试你在乎的是什么,你的业务逻辑。

注意,这个测试本身有点任意。

*我在此使用蓝色磁带而不是磁带,因为它使得测试异步函数非常简单,因为它会自动处理任何返回thennable的函数。