es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Variable de Inyección Sigilosa en el Constructor de una Clase

Estoy utilizando TypeScript para la automatización de pruebas y tengo un montón de clases como estas:

class Something {
  //propiedades
  constructor(page:Page){}
  //métodos
}

class Account {
  //propiedades
  constructor(page:Page, accountNumber: string){}
  //métodos
}

class Navigation {
  //propiedades
  constructor(page:Page, navigation: NavigationStrategy){}
  //métodos
}

El mismo objeto page:Page debo pasar a todos mis constructores, por ejemplo:

it("some test" async => {
  const page = await browser.newPage();
  const searchPage = new SearchPage(page);
  const account = new Account(page, "2135");
  const navigation = new Navigation(page, new LHSNavigation(page));
})

¿Cómo puedo inyectar automáticamente este objeto page en todos los constructores?
Por ejemplo, quiero obtener el siguiente resultado:

it("some test" async => {
  const page = await browser.newPage();
  const pageProvider = new PageProvider(page)
  const searchPage = pageProvider.create(SearchPage);
  // O
  const account = pageProvider.create(Account)("2135");

  // O tal vez
  const navigation = pageProvider.create(Navigation, LHSNavigation);
})

// O tal vez sin proveedor de página
const navigation = Navigation(LHSNavigation);

Y todos los tipos deben ser resueltos en tiempo de compilación.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para inyectar automáticamente el objeto page en todos los constructores, puede usar la inyección de dependencia con un contenedor como InversifyJS. Así es como puede lograrlo:

    1. Defina una interfaz para su objeto Page:
    interface IPage {
      // defina aquí propiedades y métodos
    }
    
    1. Defina una clase que implemente la interfaz IPage y cree una nueva instancia de página:
    import { Page } from 'puppeteer';
    
    class PageProvider implements IPage {
      private page: Page;
    
      constructor() {
        this.page = await browser.newPage();
      }
    
      getPage(): Page {
        return this.page;
      }
    }
    
    1. Cree un contenedor para registrar sus clases y dependencias usando InversifyJS:
    import { Container } from 'inversify';
    
    const container = new Container();
    
    // Registrar dependencias
    container.bind<ipage>('IPage').to(PageProvider).inSingletonScope();
    
    1. Modifique sus clases para aceptar la interfaz IPage en lugar de Page:
    class Something {
      //propiedades
      constructor(@inject('IPage') private page: IPage) {}
      //métodos
    }
    
    class Account {
      //propiedades
      constructor(
        @inject('IPage') private page: IPage,
        private accountNumber: string
      ) {}
      //métodos
    }
    
    class Navigation {
      //propiedades
      constructor(
        @inject('IPage') private page: IPage,
        private navigation: NavigationStrategy
      ) {}
      //métodos
    }
    
    1. Use el contenedor para crear instancias de sus clases:
    it('alguna prueba', async () => {
      const something = container.resolve(Something);
      const account = container.resolve(Account, { accountNumber: '2135' });
      const navigation = container.resolve(Navigation, {
        navigation: new LHSNavigation()
      });
    });
    

    Ahora, cada vez que cree una instancia de una clase que tenga una dependencia de IPage, el contenedor inyectará automáticamente la instancia de PageProvider que crea una nueva instancia de página. Esto asegura que todas sus clases tengan acceso al mismo objeto page y no tenga que pasarlo manualmente a todos sus constructores.

Comments are closed.