Mocking

Requisições HTTP

Consultar a documentação do Cypress.

Lógica

Em certas situações, é necessário modificar a lógica de um componente ou serviço que não faz requisições HTTP. Nesses casos, você pode seguir os passos nesta seção.

Configuração de environment

Para assegurar-se de que os testes sempre serão executados com o mesmo ambiente, podemos adicionar uma configuração de ambiente (environment) a ser utilizada apenas para servir a aplicação em uma situação de teste.

Arquivos

Primeiramente, crie o arquivo environment.mock.ts na pasta src/environment/ de seu app:

export const environment = {
    ...
    production: false,
    mock: true // Ativará o "mock" para os serviços do SDK Frontend
};

No arquivo angular.json de seu projeto, encontre ou crie as seguintes propriedades:

// Trocar NOME_DO_APP e CAMINHO_DO_APP pelo nome e caminho do seu app, respectivamente
{
    "projects" : {
        ...
        "NOME_DO_APP": {
            "architect": {
                ...
                "build": {
                    ...
                    "configurations": {
                        ...
                        "mock": {
                            ...
                            "fileReplacements": [
                                {
                                    "replace": "CAMINHO_DO_APP/src/environments/environment.ts",
                                    "with": "CAMINHO_DO_APP/src/environments/environment.mock.ts"
                                }
                            ]
                        }
                    }
                },
                "serve": {
                    ...
                    "configurations": {
                        ...
                        "mock": {
                            "browserTarget": "NOME_DO_APP:build:mock"
                        }
                    }
                }
            }
        }
    }
}

Com isso feito, você poderá utilizar o comando ng serve --configuration=mock para servir seu app com o environment escolhido.

App

No módulo raiz de seu app, onde VsCommonModule.forRoot() é importado, você deve prover a propriedade environment:

import { environment } from '../environments/environment'; // Importar do diretório de environments (geralmente "src/environments/")

// ...

@NgModule({
    ...
    imports: [
        ...
        VsAppCoreModule.forRoot({
            ...
            environment: environment // aqui
        }),
    ],
})
export class AppModule { ... }

Utilização

Injeção

Para utilizar o environment provido, basta injetar a constante ENVIRONMENT da seguinte maneira:

import { Inject, Optional } from '@angular/core';
import { ENVIRONMENT, IVsEnvironment } from '@viasoft/common';

// ...

export class MyClass {
    constructor(
        @Optional() @Inject(ENVIRONMENT) private environment: IVsEnvironment
    ) {}
}

Para manipulação de dependências

É possível manipular as dependências que um módulo providencia (serviços, por exemplo) da seguinte maneira:

@NgModule({ ... })
export class MyModule {

    constructor(
        @Optional() @Inject(ENVIRONMENT) private environment: IVsEnvironment
    ) {}

    static forRoot(): ModuleWithProviders {
        /*
        * Aqui utilizamos forRoot, porém outros métodos como forChild devem
        * funcionar da mesma maneira
        */
        return {
            ngModule: MyModule,
            providers: [
            {
                provide: MyService,
                useClass: this.environment?.mock ? MyMockService : MyService
            }
        }
    }
}

No exemplo acima, estamos provendo um serviço falso (MyMockService) ao invés do serviço real (MyService) baseando-se na propriedade mock de nosso environment.

@Injectable()
export class MyService {
    constructor() {
        myMethod();
    }

    myMethod() {
        console.info("do something");
    }
}
@Injectable()
export class MyMockService extends MyService {
    constructor() {
        super(); // Se MyService possui dependências injetadas, você deve passá-las aqui
    }

    myMethod() {
        console.info("do something else instead");
    }
}