javascript - Pruebas unitarias de decoradores en Typescript
Tengo una aplicación construida en TypeScript con decoradores para algunas asignaciones de propiedades por conveniencia y me pregunto cómo puedo escribir pruebas unitarias para ellos.
export function APIUrl() {
return function (target: any, key: string) {
let _value = target[key];
function getter() {
return _value;
}
function setter(newValue) {
_value = getApiURL();
}
if (delete target[key]) {
Object.defineProperty(target, key, {
get: getter,
set: setter
});
}
};
}
En una clase de especificación que tengo,
it("should return url string", ()=> {
@APIUrl();
let baseURL:string;
expect(baseURL typeOf string).toBe(true)
})
Respuesta #1
Dado que los decoradores son solo funciones, sugeriría simplemente probarlos como cualquier otra función. Y solo si realmente lo necesitas, agrega una prueba que muestre cómo usar el decorador con una clase/miembro/...
Aquí hay un ejemplo de cómo podría verse una prueba así:
import test from 'ava';
import { APIUrl } from './path';
const decorate = new APIUrl();
test.before(t => {
let obj = { someProp: 'foo' };
decorate(obj, 'someProp');
t.context.foo = obj;
});
test('should return original value', t => {
t.is(t.context.foo.someProp, 'foo');
});
Respuesta #2
Otro enfoque podría ser configurar algunas propiedades y/o métodos que usen tus decoradores y probar su uso directamente.
Nota: los decoradores solo se pueden usar en métodos y miembros de clase, así que necesitarías crear una clase ficticia en tu prueba.
Aquí hay un ejemplo:
//Test Setup
class Test {
@APIUrl()
url: string;
@AnotherDecorator()
anotherFunction() {}
}
//Unit tests
describe('Decorator Tests', () => {
it('should work', () => {
const t = new Test();
expect(t.url).toEqual("something");
expect(t.anotherFunction()).toReturn("something else");
});
}
