Estou testando uma unidade de um componente que é usado para editar um objeto. O objeto tem um único id
que é usado para capturar o objeto específico de uma matriz de objetos hospedados em um serviço. O específico id
é obtido por meio de um parâmetro que é passado por meio de roteamento, especificamente por meio da ActivatedRoute
classe.
O construtor é o seguinte:
constructor(private _router:Router, private _curRoute:ActivatedRoute, private _session:Session) {
}
ngOnInit() {
this._curRoute.params.subscribe(params => {
this.userId = params['id'];
this.userObj = this._session.allUsers.filter(user => user.id.toString() === this.userId.toString())[0];
Quero executar testes de unidade básicos neste componente. No entanto, não tenho certeza de como posso injetar o id
parâmetro, e o componente precisa desse parâmetro.
A propósito: já tenho um mock para o Session
serviço, então não se preocupe.
unit-testing
angular
angular2-routing
angular2-testing
Colby Cox
fonte
fonte
Uncaught NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'ng:///DynamicTestModule/HomeContentComponent.ngfactory.js'. at http://localhost:9876/_karma_webpack_/polyfills.bundle.js:2605
of
deve ser usado sozinho. Além disso, você provavelmente usaria emRouterTestingModule
vez do código desta resposta.Eu descobri como fazer isso!
Por
ActivatedRoute
ser um serviço, um serviço simulado para ele pode ser estabelecido. Vamos chamar esse serviço simuladoMockActivatedRoute
. Vamos estenderActivatedRoute
emMockActivatedRoute
, como segue:A linha
super(null, ....)
inicializa a superclasse, que possui quatro parâmetros obrigatórios. No entanto, neste caso, não precisamos de nada de nenhum desses parâmetros, então os inicializamos comnull
valores. Tudo o que precisamos é o valor doparams
qual é umObservable<>
. Portanto, comthis.params
, substituímos o valor deparams
e o inicializamos para ser oObservable<>
do parâmetro no qual o sujeito de teste está contando.Então, como qualquer outro serviço simulado, apenas inicialize-o e substitua o provedor do componente.
Boa sorte!
fonte
super
ouObservable
. De onde vêm estes?super()
está integrado.Observable
é derxjs/Observable
ou apenasrxjs
dependendo da sua versão. Você conseguiria usandoimport {Observable} from 'rxjs'
.No angular 8+ existe o RouterTestingModule, que você pode usar para ter acesso ao ActivatedRoute ou Roteador do componente. Além disso, você pode passar rotas para o RouterTestingModule e criar espiões para os métodos de rota solicitados.
Por exemplo, em meu componente eu tenho:
E em meu teste eu tenho:
e mais tarde na seção 'isso':
De forma semelhante, acho que você pode testar diretamente o paramMap através do método spyOnProperty do jasmine, retornando um observável ou usando mármores rxjs. Isso pode economizar algum tempo e também não requer a manutenção de uma classe extra de simulação. Espero que seja útil e faça sentido.
fonte
Aqui está como eu testei no angular 2.0 mais recente ...
e na seção Provedores
fonte
Basta adicionar uma simulação do ActivatedRoute:
...
fonte
Para algumas pessoas trabalhando em Angular> 5, se Observable.of (); não está funcionando, então eles podem usar apenas of () importando import {of} de 'rxjs';
fonte
Encontrou o mesmo problema ao criar suítes de teste para um caminho de roteamento como:
No componente, inicializei a propriedade passada como:
Ao executar os testes, se você não passar um valor de propriedade em seu ActivatedRoute simulado "useValue", ficará indefinido ao detectar alterações usando "fixture.detectChanges ()". Isso ocorre porque os valores simulados para ActivatedRoute não contêm a propriedade params.property. Em seguida, é necessário que o useValue simulado tenha esses parâmetros para que o aparelho inicialize 'this.property' no componente. Você pode adicioná-lo como:
Você pode começar a testar como, por exemplo:
Agora, digamos que você gostaria de testar um valor de propriedade diferente, então você pode atualizar seu ActivatedRoute simulado como:
Espero que isto ajude!
fonte
Provedor adicionado na classe de teste como:
fonte