【问题标题】:Using Jasmine to spy on document.createElement throws error from angular mock使用 Jasmine 监视 document.createElement 会从角度模拟引发错误
【发布时间】:2016-05-24 00:25:16
【问题描述】:

我有一个处理网络摄像头的 Angular 服务。这是我要测试的功能:

this.takePicture = function() {
    var canvas = document.createElement('canvas');
    canvas.width = this.width;
    canvas.height = this.height;

    var context = canvas.getContext('2d');
    context.drawImage(this.videoElement, 0, 0, this.width, this.height);

    return canvas.toDataURL('image/jpeg', 100);
};

我正在尝试模拟对 document.createElement 的调用并返回一个假画布对象。这是我的测试:

it('should draw an image', function() {
    var drawImageSpy = jasmine.createSpy('drawImage');

    var canvas = {
        getContext: jasmine.createSpy('getContext').and.returnValue({ drawImage: drawImageSpy }),
        width: 0,
        height: 0,
        toDataURL: jasmine.createSpy('toDataUrl').and.returnValue('data-uri')
    };

    document.createElement = jasmine.createSpy('createCanvas').and.returnValue(canvas);

    WcCameraService.takePicture();

    expect(drawImageSpy).toHaveBeenCalled();
});

这是我得到的错误:

TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
    at TypeError (native)
    at Function.jQuery.extend.buildFragment (C:/Projects/Accurev/WebCOE_FRF_DEV/src/bower_components/jquery/dist/jquery.js:5565:24)
    at Function.jQuery.parseHTML (C:/Projects/Accurev/WebCOE_FRF_DEV/src/bower_components/jquery/dist/jquery.js:9923:18)
    at jQuery.fn.init (C:/Projects/Accurev/WebCOE_FRF_DEV/src/bower_components/jquery/dist/jquery.js:2774:33)
    at Object.jQuery [as element] (C:/Projects/Accurev/WebCOE_FRF_DEV/src/bower_components/jquery/dist/jquery.js:73:10)
    at $get (C:/Projects/Accurev/WebCOE_FRF_DEV/src/bower_components/angular-mocks/angular-mocks.min.js:6:18224)
    at Object.e [as invoke] (C:/Projects/Accurev/WebCOE_FRF_DEV/src/bower_components/angular/angular.min.js:39:193)
    at C:/Projects/Accurev/WebCOE_FRF_DEV/src/bower_components/angular/angular.min.js:41:10
    at Object.d [as get] (C:/Projects/Accurev/WebCOE_FRF_DEV/src/bower_components/angular/angular.min.js:38:394)
    at Object.<anonymous> (C:/Projects/Accurev/WebCOE_FRF_DEV/src/bower_components/angular-mocks/angular-mocks.min.js:6:21105)

有人知道为什么会这样吗?我正在寻找角度模拟,此时它似乎失败了:

if (window.jasmine || window.mocha) {

...

  if (injector) {
    injector.get('$rootElement').off();
  }

【问题讨论】:

    标签: javascript angularjs unit-testing jasmine angular-mock


    【解决方案1】:

    据我所知,document.createElement 是不可变的。你真的不应该首先监视它。这是一个内置函数,每次都会以相同的方式执行。你的其他间谍看起来不错。

    【讨论】:

      【解决方案2】:

      监视它有点奇怪。但是 - 在更大版本的 Angular 中 - 你可以通过窥探 createElement 方法来完成它。您可以通过returnValue 与茉莉花间谍一起参与此活动,以期待某些电话。像这样:

      const toDataUrlSpy = jasmine.createSpy('dataUrl');
      spyOn(document, 'createElement').and.returnValue({
        width: 0,
        height: '',
        getContext: () => ({ drawImage: () => {} })
        toDataURL: toDataUrlSpy
      });
      
      service.takePicture();
      expect(toDataUrlSpy).toHaveBeenCalledTimes(1);
      

      干杯!

      【讨论】:

        猜你喜欢
        • 2016-07-07
        • 1970-01-01
        • 2017-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多