如何在角度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)
我发现的解决方案
将测试代码本身放在闭包中或在闭包内添加代码,该代码存储对外部作用域中现有对象的局部变量的引用.
稍后使用工具删除测试代码. http://philipwalton.com/articles/how-to-unit-test-private-functions-in-javascript/
如果您有任何问题,请建议我更好的方法来解决这个问题?
PS
像这样的类似问题的大部分答案都不能解决问题,这就是我问这个问题的原因
大多数开发人员都说你不测试私人功能,但我不是说他们错了或是对的,但我的案例有必要对私人进行测试.
我正在研究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将它们作为一个实例
我正在制作一个示例应用程序来连接到离线2 in typescript中的websocket服务器.回到repo
我的要求是在应用程序启动期间进行websocket连接
我正在使用angular2-websocket来创建连接.
参考文献:
http://blog.thoughtram.io/angular/2015/09/17/resolve-service-dependencies-in-angular-2.html
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)
import {Injectable, Component, …Run Code Online (Sandbox Code Playgroud) 当有条件地加载子项的模板中有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(不同类型)时不适合 - 使用事件发射器通知子加载的时间.
我发布这个问题,因为经过数小时的研究后没有适当的解决方案.
我正在研究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方法之外,还有其他方法可以测试吗?
我正在研究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) angular ×4
typescript ×4
ionic2 ×2
jasmine ×2
unit-testing ×2
android ×1
angularjs ×1
cordova ×1
javascript ×1