Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

184
Visualizações
¿Cómo stub función que devuelve una promesa?

Estoy tratando de bloquear una función usando sinon. La función tiene la siguiente firma

 export function getIndexDocument( svc: MetaHTTPService | ServiceConfig ): MetaPromise<RepoResponseResult<IndexDocument>> {

¿Es esta la forma correcta de subtitularlo?

 sandbox.stub(getIndexDocument).resolves({} as RepoResponseResult)

Lo intenté pero me devuelve un error.

Así es como se llama esta función.

Tengo una clase llamada AssetsController con las siguientes funciones

 public async exploreIndexDocument(): Promise<Asset | undefined> { // it makes an HTTP request and returns a promise that resolves with the following info { repoId: "", assetId: "" } const { result: { assignedDirectories } } = await getIndexDocument(this.serviceConfig).catch(err => { throw new Error(`Bad repsonse`); }); return { repoId: result.repoId; assetId: result.assetId } } public async function copyAsset(asset) { const res = await this.exploreIndexDocument(); const repoId = res.repoId; return asset.copy(repoId); }

Estoy tratando de probar la función copyAsset, pero llama a exploreIndexDocument que llama a getIndexDocument. getIndexDocument se importa en la parte superior del archivo y reside en el módulo @ma/http. getIndexDocument realiza una solicitud HTTP.

¿Cómo puedo probar copyAsset dado que llama a getIndexDocument que realiza una solicitud HTTP?

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Creo que la mayoría de sus problemas se pueden resolver revisando su arquitectura. Por ejemplo, en lugar de crear una dependencia explícita en getIndexDocument dentro de su clase AssetController , simplemente puede inyectarlo. Esto le permitirá intercambiar implementaciones según el contexto.

 type IndexDocumentProvider = (svc: MetaHTTPService | ServiceConfig) => MetaPromise<RepoResponseResult<IndexDocument>>; interface AssetControllerOptions { indexDocumentProvider: IndexDocumentProvider } class AssetController { private _getIndexDocument: IndexDocumentProvider; public constructor(options: AssetControllerOptions) { this._getIndexDocument = options.indexDocumentProvider; } }

Luego puede usar this._getIndexDocument en cualquier lugar y no preocuparse por cómo hacer que la implementación original se comporte como desea en sus pruebas. Simplemente puede proporcionar una implementación que haga lo que quiera.

 describe('copyAsset', () => { it('fails on index document error.', () => { const controller = new AssetController({ indexDocumentProvider: () => Promise.reject(new Error(':(')); }); .... }); it('copies asset using repo id.', () => { const controller = new AssetController({ indexDocumentProvider: () => Promise.resolve({ repoId: "420" }) }); ... }); });

Obviamente, puede usar stubs en lugar de solo funciones o lo que sea si necesita algo elegante.

Arriba, eliminamos una dependencia explícita de una implementación y, en su lugar, la reemplazamos con un contrato que debe proporcionarse al controlador. Normalmente se denomina Inversion of Control e Dependency Injection .

about 4 years ago · Juan Pablo Isaza Relatório

0

De acuerdo con los documentos , no puede bloquear una función existente.

Puedes:

 // Create an anonymous sstub function var stub = sinon.stub(); // Replaces object.method with a stub function. An exception is thrown // if the property is not already a function. var stub = sinon.stub(object, "method"); // Stubs all the object's methods. var stub = sinon.stub(obj);

Lo que no puedes hacer es stub solo una función como:

 var stub = sinon.stub(myFunctionHere);

Esto tiene sentido porque si todo lo que tiene es una referencia a una función, entonces puede crear una nueva función para usar en su lugar, y luego pasarla a donde sea que su prueba la necesite.


Creo que solo quieres:

 const myStub = sandbox.stub().resolves({} as RepoResponseResult)

En su actualización, parece que desea colocar el código auxiliar en la clase AssetsController . Consulte esta respuesta para obtener más información al respecto, pero en este caso creo que desea:

 const myStub = sandbox .stub(AssetsController.prototype, 'exploreIndexDocument') .resolves({} as RepoResponseResult)

Ahora, cada vez que una instancia de AssetsController llama a su método exploreIndexDocument , se debe usar el código auxiliar en su lugar.

Patio de juegos

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda