【问题标题】:AngularJS TypeError: 'undefined' is not an object' Jasmine testAngularJS TypeError:'未定义'不是对象'茉莉花测试
【发布时间】:2016-10-13 07:03:49
【问题描述】:

在我的测试中模拟/监视 API 调用时,我在运行 Jasmine 测试时遇到上述错误。这是我调用 API 的代码:

UploadedReleasesController.$inject = ['$log', '$scope', '$filter', '$modal', 'ReleaseService', 'TrackService', 'APP_CONFIG', 'DeliveriesService'];
function UploadedReleasesController ($log, $scope, $filter, $modal, releaseService, trackService, APP_CONFIG, deliveriesService){
.
. 
.
releaseService.releases(vm.currentWorkspace).then(function (responseValues) {
            vm.albums = responseValues;
            if(vm.albums.length !== 0){
                vm.selected.album = vm.albums[0];

releaseService 是我定义的服务,releases 是我想要监视的方法之一。它需要一个字符串参数,比如说'HIGH'。这是我要模拟该调用的测试文件:

describe('app module', function() {
    var vm, scope, modalInstance, releaseService, trackService, deliveriesService;

    beforeEach(module('app.uploadedReleases'));     // Main module name

    beforeEach(module('app.config'));       
    beforeEach(module('auth'));             

    beforeEach(function() {
        var mockReleasesData = {
            "test" : 100
            }
        };

        releaseService = jasmine.createSpyObj("releaseService", ["releases"]);
        releaseService.releases('HIGH').and.returnValue(mockReleasesData);
    });


    beforeEach(inject(function($controller, $log, $rootScope, $filter, APP_CONFIG) {

        scope = $rootScope.$new();

        modalInstance = {
            close: jasmine.createSpy('modalInstance.close'),
            open: jasmine.createSpy('modalInstance.open'),
            dismiss: jasmine.createSpy('modalInstance.dismiss'),
            result: {
                then: jasmine.createSpy('modalInstance.result.then')
            }
        };

        vm = $controller('UploadedReleasesController', {'APP_CONFIG':APP_CONFIG, '$log':$log, '$scope':scope, '$filter':$filter, '$modal':modalInstance,
            'ReleaseService':releaseService, 'TrackService':trackService, 'DeliveriesService':deliveriesService});

    }));

运行测试时,我收到错误:

TypeError: 'undefined' 不是对象(评估 'releaseService.releases('HIGH').and') 在 test-release.controller.spec.js:93 TypeError:“未定义”不是对象(评估“releaseService.releases(vm.currentWorkspace).then”) 未定义

这是来自release.service.js的实际releaseService

releaseService.releases = getReleases;
 .
 .
 .
function getReleases(workspace){
        var releases = [];
        headers.Workspace = workspace;  // set the workspace
        var deferred = $q.defer();
       // Then make $http calls and return a promise
  .
  .

【问题讨论】:

    标签: javascript angularjs unit-testing jasmine


    【解决方案1】:

    我看到了一些可能存在问题的地方:

    1. 调用release方法:

    releaseService.releases('HIGH').and.returnValue(mockReleasesData);

    releases 方法在这里被调用,如果这里应该设置一个返回值那么我认为语法可能是:

    releaseService.releases.and.returnValue(mockReleasesData);

    然后你可以断言 releases 被正确的数据调用。

    1. 上述问题解决后。 mockReleaseData 没有 then 方法。由于它是从releases 返回的,因此将调用其then 方法:

    releaseService.releases(vm.currentWorkspace).then(function (responseValues)

       var mockReleasesData = {
            "test" : 100
            },
            then: function(callbackFn) {  
              // could call callbackFn with fake responseValues
            }
        };
    

    测试的目的是什么?是为了行使then匿名功能吗?通过少量的重组来暴露你的逻辑,测试起来可能很简单。

    function handleResponseValues(vm, responseValues) {
                vm.albums = responseValues;
                if(vm.albums.length !== 0){
                    vm.selected.album = vm.albums[0];
    }
    

    这仍然需要 then 回调调用 handleResponseValues 并引用 vmresponseValues,但会公开独立于承诺链的所有逻辑。

    【讨论】:

    • 这很有效,我的测试运行在我刚刚测试我的控制器的情况下。您能否解释更多,以便我了解发生了什么?尤其是then: function(callbackFn),那应该做什么?这真的会帮助我理解,先生
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2017-09-27
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多