Búsqueda de sitios web

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");
    });
}

Artículos relacionados