模拟服务返回承诺:无法读取未定义的属性

香肠

我正在使用Karma和Jasmine进行单元测试。我将app.js作为主要源文件:

app.service("someServ", function(){
  this.sendMsg = function(name){
    return "Hello " + name;
  }
})

app.factory("appFactory", function ($q, someServ) {
  function getData() {
    var defer = $q.defer();
    defer.resolve("Success message");
    return defer.promise;
} 

function foo(){
    var text = someServ.sendMsg("Message");
    alert(text);
}
return {
    getData : getData,
    foo : foo
}
})

app.controller("mainController",['$scope','$http','appFactory',function($scope, $http, appFactory){
var mct = this;
mct.printData = function(){
    var myPromise = appFactory.getData();
    myPromise
        .then(function(data){
            alert("Promise returned successfully. Data : " + data);
        }, function(error){
            alert("Something went wrong.... Error: "  + error);
        })
}
mct.showMsg = function(){
    appFactory.foo();
}
}]);

我的testFile.js如下:

   beforeEach(module(function($provide){
    $provide.service("someServ", function(){
        this.sendMsg =   jasmine.createSpy('sendMsg').and.callFake(function(param){})
    });

    $provide.factory("appFactory", function(someServ, $q){
        function getData(){
            var defer = $q.defer();
            defer.resolve("Success message");
            return defer.promise;
        }
        function foo(){
            var facParam = "some text";
            someServ.sendMsg(facParam);
        }
        return {
            getData : getData,
            foo : foo
        }
    });
}));

var $scope, mainController, appFactoryMock, someServMock;

beforeEach(inject(function($rootScope, $controller, $http, $q, appFactory, someServ){
    appFactoryMock = appFactory;
    someServMock = someServ;
    $scope = $rootScope.$new();
    mainController = $controller("mainController", {
        $scope : $scope,
        $http : $http,
        appFactory : appFactoryMock
    });

}));

it('that mainController is calling appFactory methods', function(){
    spyOn(appFactoryMock, "getData");
    mainController.printData();
    scope.$root.$digest();
    expect(appFactoryMock.getData).toHaveBeenCalled();
})

it('that appFactory method foo calls someServ sendMsg', function(){
    spyOn(appFactoryMock, "foo");
    appFactoryMock.foo();
    expect(someServMock.sendMsg).toHaveBeenCalled();
});

以上两个测试均失败。对于第一个,错误是:Cannot read property of undefined和对于第二个错误expected spy sendMsg to have been called第一个错误发生在:app.js文件,如调用堆栈中所示。我还使用karma chrome窗口中的Debug选项调试了测试。printData()函数正在app.js中调用实际代码,但我已经对其进行了模拟

请任何人解释我为什么会这样以及如何解决这个问题?为什么要调用原始代码,以及如何使这两个测试通过?

马里奥·拉马基亚(Mario Lamacchia)

Jasmine的间谍仅检查该函数是否已被调用,而不会触发实际的实现。这就是为什么getData().then会引发错误。

正如您可以阅读Jasmine的文档一样,您需要添加.and.callThrough()才能通过原始功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我正在返回一个承诺并收到:无法读取未定义的属性“then”

来自分类Dev

角嵌套承诺'无法读取未定义的属性'then'

来自分类Dev

无法读取承诺中未定义的属性“then”

来自分类Dev

通过 spy/karma 模拟服务类时无法读取未定义的属性“doc”

来自分类Dev

AngularJS modalpopup服务调用无法读取未定义的属性

来自分类Dev

灰烬通知错误无法读取未定义的属性“服务”

来自分类Dev

TypeError:无法读取未定义的“服务”的属性

来自分类Dev

HTTP 获取服务 - 无法读取未定义的属性

来自分类Dev

Vuex返回“ TypeError:无法读取未定义的属性'getters'”

来自分类Dev

Javascript函数返回“无法读取未定义的属性长度”

来自分类Dev

Nestjs readFileSync返回无法读取未定义的属性“ readFileSync”

来自分类Dev

返回错误无法读取未定义 reactjs 的属性“setstate”

来自分类Dev

为什么我的单元测试在此React测试中返回“无法读取未定义的属性”模拟”?

来自分类Dev

v-on处理程序中的错误(承诺/异步):“ TypeError:无法读取未定义的属性'data'” //未定义

来自分类Dev

未捕获(承诺)TypeError:无法读取未定义(...)的属性'createElement'

来自分类Dev

VueJS:未捕获(承诺)TypeError:无法读取未定义的属性“ push”

来自分类Dev

页面对象-承诺处理-错误“无法读取未定义的属性'submit'”

来自分类Dev

离子-未捕获(承诺):TypeError:无法读取未定义的属性'then'

来自分类Dev

Tensorflow.js:未捕获(承诺)TypeError:无法读取未定义的属性'length'

来自分类Dev

Angular 7-错误错误:未捕获(承诺):TypeError:无法读取未定义的属性“ forEach”

来自分类Dev

未捕获(承诺)TypeError:无法读取未定义的属性图形

来自分类Dev

错误错误:未捕获(承诺):TypeError:无法读取未定义的属性“ id”

来自分类Dev

错误错误:未捕获(承诺):TypeError:无法读取未定义的属性“ id”

来自分类Dev

VueJS:未捕获(承诺)TypeError:无法读取未定义的属性“ rol”

来自分类Dev

React + Axios:未捕获(承诺)TypeError:无法读取未定义的属性“map”

来自分类Dev

错误错误:未捕获(承诺):类型错误:无法读取未定义的属性“标题”

来自分类Dev

未处理的承诺拒绝错误:无法读取未定义的属性“json”

来自分类Dev

未处理的承诺拒绝:无法读取未定义值的属性“推送”

来自分类Dev

量角器:解决承诺时无法读取未定义的属性“then”

Related 相关文章

  1. 1

    我正在返回一个承诺并收到:无法读取未定义的属性“then”

  2. 2

    角嵌套承诺'无法读取未定义的属性'then'

  3. 3

    无法读取承诺中未定义的属性“then”

  4. 4

    通过 spy/karma 模拟服务类时无法读取未定义的属性“doc”

  5. 5

    AngularJS modalpopup服务调用无法读取未定义的属性

  6. 6

    灰烬通知错误无法读取未定义的属性“服务”

  7. 7

    TypeError:无法读取未定义的“服务”的属性

  8. 8

    HTTP 获取服务 - 无法读取未定义的属性

  9. 9

    Vuex返回“ TypeError:无法读取未定义的属性'getters'”

  10. 10

    Javascript函数返回“无法读取未定义的属性长度”

  11. 11

    Nestjs readFileSync返回无法读取未定义的属性“ readFileSync”

  12. 12

    返回错误无法读取未定义 reactjs 的属性“setstate”

  13. 13

    为什么我的单元测试在此React测试中返回“无法读取未定义的属性”模拟”?

  14. 14

    v-on处理程序中的错误(承诺/异步):“ TypeError:无法读取未定义的属性'data'” //未定义

  15. 15

    未捕获(承诺)TypeError:无法读取未定义(...)的属性'createElement'

  16. 16

    VueJS:未捕获(承诺)TypeError:无法读取未定义的属性“ push”

  17. 17

    页面对象-承诺处理-错误“无法读取未定义的属性'submit'”

  18. 18

    离子-未捕获(承诺):TypeError:无法读取未定义的属性'then'

  19. 19

    Tensorflow.js:未捕获(承诺)TypeError:无法读取未定义的属性'length'

  20. 20

    Angular 7-错误错误:未捕获(承诺):TypeError:无法读取未定义的属性“ forEach”

  21. 21

    未捕获(承诺)TypeError:无法读取未定义的属性图形

  22. 22

    错误错误:未捕获(承诺):TypeError:无法读取未定义的属性“ id”

  23. 23

    错误错误:未捕获(承诺):TypeError:无法读取未定义的属性“ id”

  24. 24

    VueJS:未捕获(承诺)TypeError:无法读取未定义的属性“ rol”

  25. 25

    React + Axios:未捕获(承诺)TypeError:无法读取未定义的属性“map”

  26. 26

    错误错误:未捕获(承诺):类型错误:无法读取未定义的属性“标题”

  27. 27

    未处理的承诺拒绝错误:无法读取未定义的属性“json”

  28. 28

    未处理的承诺拒绝:无法读取未定义值的属性“推送”

  29. 29

    量角器:解决承诺时无法读取未定义的属性“then”

热门标签

归档