javascript - Testa TypeScript-klasser med Jasmine
Jag skulle vilja fråga dig hur jag kan testa en klass som tar emot en instans av en annan klass i konstruktorn. Till exempel vill jag testa metoden 'hasChildRoutes()':
class Route implements ng.route.IRoute {
public url: string;
public config: RouteConfig;
constructor(url: string, config: RouteConfig) {
this.url = url;
this.config = config;
}
public hasChildRoutes(): boolean {
return this.config.childRoutes.length > 0;
}
}
jag skrev ett dåligt enhetstest för detta (jag skapar nya instanser av andra klasser vilket jag tycker är dåligt):
beforeEach(() => {
routeSetting = new RouteSetting(1, '');
routeConfig = new RouteConfig('', '', routeSetting, [], '');
});
describe('Methods test', () => {
var childRoute: Route;
beforeEach(() => {
route = new Route('', routeConfig);
});
it('sould return false when Route has no child routes', () => {
expect(route.hasChildRoutes()).toBeFalsy();
});
it('sould return true when Route has child routes', () => {
routeConfig = new RouteConfig('', '', routeSetting, [route], '');
route = new Route('', routeConfig);
expect(route.hasChildRoutes()).toBeTruthy();
});
});
Svar #1
Det är helt giltigt för dig att tillhandahålla exempel på beroenden som en del av arrange inom arrange/act/assert.
Med det sagt, om du vill testa a (som beror på b) isolerat kan du tillhandahålla en mock b t.ex. med sinonjs: http://sinonjs.org/
Svar #2
Bara några tankar om detta.
Dina tester ser bra ut, men det verkar inte nödvändigt att använda beforeEach och afterEach på det här sättet. Det gör testerna förvirrande och svårlästa. Snarare så här:
it('should return false when Route has no child routes', () => {
// arrange
routeSetting = new RouteSetting(1, '');
routeConfig = new RouteConfig('', '', routeSetting, [], '');
// act
route = new Route('', routeConfig);
// assert
expect(route.hasChildRoutes()).toBeFalsy();
});
Borde inte hasChildRoutes() också vara en egenskap hos RouteConfig? och inte Route?
