小编tym*_*spy的帖子

如何使用Jasmine为私有方法编写Angular 2/TypeScript的单元测试

如何在角度2中测试私有函数?

class FooBar {

    private _status: number;

    constructor( private foo : Bar ) {
        this.initFooBar();

    }

    private initFooBar(){
        this.foo.bar( "data" );
        this._status = this.fooo.foo();
    }

    public get status(){
        return this._status;
    }

}
Run Code Online (Sandbox Code Playgroud)

我发现的解决方案

  1. 将测试代码本身放在闭包中或在闭包内添加代码,该代码存储对外部作用域中现有对象的局部变量的引用.

    稍后使用工具删除测试代码. http://philipwalton.com/articles/how-to-unit-test-private-functions-in-javascript/

如果您有任何问题,请建议我更好的方法来解决这个问题?

PS

  1. 像这样的类似问题的大部分答案都不能解决问题,这就是我问这个问题的原因

  2. 大多数开发人员都说你不测试私人功能,但我不是说他们错了或是对的,但我的案例有必要对私人进行测试.

unit-testing jasmine typescript angular

159
推荐指数
8
解决办法
7万
查看次数

Angular 2中的依赖注入在使用内联注入器和构造函数注入时创建多个实例

我正在研究Ionic 2 TypeScript项目.在应用程序启动期间,我通过构造函数注入服务.

@App({
    providers: [ MyService ]
})
export class MyApp {
   constructor( private instance1 : MyService ){}
}
Run Code Online (Sandbox Code Playgroud)

在我使用的另一个班级

let injector = Injector.resolveAndCreate ( [ MyService ] );
let instance2 = injector .get( MyService  );
Run Code Online (Sandbox Code Playgroud)

我得到两个不同的变量实例instance1和instance2.

有没有办法通过使用内联的Injector和Constructor将它们作为一个实例

dependency-injection typescript ionic-framework angular

8
推荐指数
1
解决办法
462
查看次数

如何在Angular 2中的服务中注入服务时传递依赖参数(Ionic 2/Angular 2/Typescript)

我正在制作一个示例应用程序来连接到离线2 in typescript中的websocket服务器.回到repo

我的要求是在应用程序启动期间进行websocket连接

我正在使用angular2-websocket来创建连接.

参考文献:

  1. http://blog.thoughtram.io/angular/2015/09/17/resolve-service-dependencies-in-angular-2.html

  2. http://blog.thoughtram.io/angular/2015/05/18/dependency-injection-in-angular-2.html

我收到错误"无法解析'$ WebSocket'的所有参数(字符串,数组,?).确保所有参数都使用Inject进行修饰或具有有效的类型注释,并且'$ WebSocket'使用Injectable进行修饰. "

代码: app.ts

import {App, Platform} from 'ionic-framework/ionic';
import {TabsPage} from './pages/tabs/tabs';
import {ConnectionService} from './framework/connection/connection-service'
import {$WebSocket} from 'angular2-websocket/angular2-websocket';
import {bootstrap} from 'angular2/platform/browser';

// https://angular.io/docs/ts/latest/api/core/Type-interface.html
import {Type} from 'angular2/core';


@App({
  template: '<ion-nav [root]="rootPage"></ion-nav>',
  config: {}
})
export class MyApp {
  rootPage: Type = TabsPage;

  constructor(platform: Platform, private conn : ConnectionService) {
    platform.ready().then(() => {
      this.conn.connect();
    });
  }
}
bootstrap(MyApp, [$WebSocket, ConnectionService]);
Run Code Online (Sandbox Code Playgroud)

连接service.ts

import {Injectable, Component, …
Run Code Online (Sandbox Code Playgroud)

typescript ionic-framework ionic2 angular2-services angular

7
推荐指数
1
解决办法
4268
查看次数

如何在模板中存在ngIf时确定Angular2组件是否已完全加载(包括ViewChilds)

当有条件地加载子项的模板中有ngIf时,是否可以识别Angular2组件(此处为AppComponent)是否已完全加载(包括ViewChilds).

参考:Angular 2 @ViewChild注释返回undefined 此示例取自上面的引用.感谢kenecaswell

import {Component, ViewChild, OnInit, AfterViewInit} from 'angular2/core';
import {ControlsComponent} from './child-component-1';
import {SlideshowComponent} from './slideshow/slideshow.component';

@Component({
    selector: 'app',
    template:  `
        <div *ngIf="controlsOn">
            <controls ></controls>
            <slideshow></slideshow>
        </div>
    `,
    directives: [SlideshowComponent, ControlsComponent]
})

export class AppComponent {
    @ViewChild(ControlsComponent) controls:ControlsComponent;   
    @ViewChild(SlideshowComponent) slide:SlideshowComponent;

    controlsOn:boolean = false;

    ngOnInit() {
        console.log('on init', this.controls);
        // this returns undefined
    }

    ngAfterViewInit() {
        console.log('on after view init', this.controls);
        // this returns null
    }

}
Run Code Online (Sandbox Code Playgroud)

由于ngIf条件,在加载子组件之前触发ngOnInit && ngAfterViewInit

我需要在加载SlideshowComponent和ControlsComponent时识别并基于此执行操作.

我有一个hacky解决方案,当有多个ViewChild(不同类型)时不适合 - 使用事件发射器通知子加载的时间.

我发布这个问题,因为经过数小时的研究后没有适当的解决方案.

angular-components angular

7
推荐指数
1
解决办法
2582
查看次数

如何使用jasmine + TypeScript测试使用常量调用的函数

我正在研究Angular2/TypeScript项目并使用jasmine进行单元测试.

如何使用jasmine测试使用常量调用的函数.例如.Logo.ts

export const RADIUS: number = 10;

export class Logo {
  ...
  protected drawCircle( x: number, y: number, r: number ){...}

  protected drawLogo(){
    this.drawCircle( RADIUS, RADIUS, RADIUS );
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

Logo.spec.ts

describe('drawLogo', function () {
  beforeEach(() => {
    spyOn( logo, 'drawCircle');
  }
  it('should call drawCircle method with parameters'){
    expect( logo.drawCircle ).toHaveBeenCalledWith( 10, 10, 10 ); //This fails
  }
}
Run Code Online (Sandbox Code Playgroud)

除了将常量as参数传递给toHaveBeenCalledWith方法之外,还有其他方法可以测试吗?

javascript unit-testing jasmine angularjs typescript

6
推荐指数
1
解决办法
1054
查看次数

当我模拟Ionic App它会抛出TypeError:无法在undefined上调用方法

我正在研究Ionic 2 beta(最新版本)项目.该应用程序在Web客户端上运行,没有任何错误.但是,当我试图模仿时,我得到一个白色的屏幕(死亡的白色屏幕).没有登录错误adb logcat.

因此尝试通过实时重新加载来模拟应用程序.(如前所述这里).

当我执行命令 ionic emulate android -l -c

我收到此错误:

Error happened TypeError: Can't call method on  undefined
  at TypeError (native)
  at module.exports (D:\ionicApp\node_modules\core-js\modules\_defined.js:3:28)
  at createHTML (D:\ionicApp\node_modules\core-js\modules\_string-html.js:7:19)
  at bold (D:\ionicApp\node_modules\core-js\modules\es6.string.bold.js:5:12)
  at cb (C:\Users\User1\AppData\Roaming\npm\node_modules\ionic\node_modules\ionic-app-lib\node_modules\winston\lib\winston\logger.js:206:7)
  at done (C:\Users\User1\AppData\Roaming\npm\node_modules\ionic\node_modules\ionic-app-lib\node_modules\winston\node_modules\async\lib\async.js:167:19)
  at C:\Users\User1\AppData\Roaming\npm\node_modules\ionic\node_modules\ionic-app-lib\node_modules\winston\node_modules\async\lib\async.js:40:16
  at C:\Users\User1\AppData\Roaming\npm\node_modules\ionic\node_modules\ionic-app-lib\node_modules\winston\lib\winston\logger.js:193:9
  at [object Object].Console.log (C:\Users\User1\AppData\Roaming\npm\node_modules\ionic\node_modules\ionic-app-lib\node_modules\winston\lib\winston\transports\console.js:127:3)
  at emit (C:\Users\User1\AppData\Roaming\npm\node_modules\ionic\node_modules\ionic-app-lib\node_modules\winston\lib\winston\logger.js:186:17)
  at C:\Users\User1\AppData\Roaming\npm\node_modules\ionic\node_modules\ionic-app-lib\node_modules\winston\node_modules\async\lib\async.js:157:13
  at _each (C:\Users\User1\AppData\Roaming\npm\node_modules\ionic\node_modules\ionic-app-lib\node_modules\winston\node_modules\async\lib\async.js:57:9)
  at Object.async.each (C:\Users\User1\AppData\Roaming\npm\node_modules\ionic\node_modules\ionic-app-lib\node_modules\winston\node_modules\async\lib\async.js:156:9)
  at [object Object].Logger.log (C:\Users\User1\AppData\Roaming\npm\node_modules\ionic\node_modules\ionic-app-lib\node_modules\winston\lib\winston\logger.js:214:9)
  at [object Object].target.(anonymous function) [as info] (C:\Users\User1\AppData\Roaming\npm\node_modules\ionic\node_modules\ionic-app-lib\node_modules\winston\lib\winston\common.js:54:18)
  at Object.IonicTask.setupLiveReload (C:\Users\User1\AppData\Roaming\npm\node_modules\ionic\lib\ionic\cordova.js:338:7)
  at C:\Users\User1\AppData\Roaming\npm\node_modules\ionic\lib\ionic\cordova.js:104:21
  at _fulfilled (C:\Users\User1\AppData\Roaming\npm\node_modules\ionic\node_modules\q\q.js:787:54) …
Run Code Online (Sandbox Code Playgroud)

android android-emulator cordova ionic-framework ionic2

5
推荐指数
1
解决办法
619
查看次数