Angular.js: angular-mock 1.5.1 TypeError: undefined não é um construtor (avaliando 'angular.element.cleanData (cleanUpNodes)')

Criado em 16 mar. 2016  ·  67Comentários  ·  Fonte: angular/angular.js

Meus testes funcionam bem com angular-mock 1.5.0, mas com 1.5.1 todos os testes falham com:
TypeError: undefined is not a constructor (evaluating 'angular.element.cleanData(cleanUpNodes)') in ../node_modules/angular-mocks/angular-mocks.js (line 2776) $$cleanup@../node_modules/angular-mocks/angular-mocks.js:2776:32 $$afterEach@../node_modules/angular-mocks/angular-mocks.js:2746:23

investigation more info regression bug

Comentários muito úteis

Eu estava vendo esse problema também em nossos testes depois de tentar atualizar para a v1.5.2. Alterando a linha 2776 do angular-mocks.js de:
angular.element.cleanData(cleanUpNodes);
Para:
if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes);

Corrija o problema. Em nosso caso, estamos tentando espionar o angular.element por vários motivos.

Todos 67 comentários

Isso é estranho, já que nenhum construtor está sendo chamado nesse trecho de código. Talvez você possa fornecer mais algumas informações? Uma cópia de um teste com falha, de preferência um que possamos executar.

Aqui você pode encontrar um teste, ele não faz nada, mas todos os testes que temos falham (apenas para a versão 1.5.1, 1.5.0 é bom).
Test Runner Karma, Test Framework Jasmine. Configuração do projeto "Fundação para aplicativos"
https://github.com/HamburgOOU/hoou-webapp/blob/master/test/controllerTest/AboutControllerTest.js

Parece que você está usando o ui-router, certo?
Você pode tentar criar um teste que seja executado aqui: http://plnkr.co/edit/tpl : vojSWqpk1yBjQbbPeXRH?

Como sugestão, você também deve tentar remover as dependências do seu teste e ver o que exatamente dispara o erro (você tem muitas dependências no módulo do aplicativo)

Sim, usando o angular-ui-router (0.2.18).
Trommorow tentarei encontrar a dependência que causa isso.

+1, estou recebendo um erro muito semelhante ao tentar testar um provedor.

TypeError: 'undefined' não é uma função (avaliando 'angular.element.cleanData (cleanUpNodes)')
em ../node_modules/angular-mocks/angular-mocks.js:2776
em ../node_modules/angular-mocks/angular-mocks.js:2746

Edit: Este erro ocorre com a versão 1.5.1, voltei para 1.5.0 e tudo funciona novamente.

@petebacondarwin undefined is not a constructor é o erro críptico que o PhantomJS dá quando você tenta chamar uma função que não está definida. É equivalente ao erro a.something is not a function do Chrome.

Estamos recebendo um erro semelhante no Angular / Mock 1.5.1, que não é um problema no 1.5.0:

# PhantomJS
TypeError: undefined is not a constructor (evaluating 'angular.element('<div ng-app></div>').data('$injector', $injector)') 
    in /bower_components/angular-mocks/angular-mocks.js (line 2102)
    /bower_components/angular-mocks/angular-mocks.js:2102:69
    invoke@/bower_components/angular/angular.js:4443:22
    /bower_components/angular/angular.js:4261:43
    getService@/bower_components/angular/angular.js:4402:46
    invoke@/bower_components/angular/angular.js:4434:23
    /bower_components/angular/angular.js:4261:43
    getService@/bower_components/angular/angular.js:4402:46
    invoke@/bower_components/angular/angular.js:4434:23
    /bower_components/angular/angular.js:4261:43
    getService@/bower_components/angular/angular.js:4402:46
    invoke@/bower_components/angular/angular.js:4434:23
    /bower_components/angular/angular.js:4265:85
    forEach@/bower_components/angular/angular.js:336:24
    createInjector@/bower_components/angular/angular.js:4265:10
    workFn@/bower_components/angular-mocks/angular-mocks.js:2922:60

# Chrome
TypeError: angular.element(...).data is not a function
        at $get (/bower_components/angular-mocks/angular-mocks.js:2102:65)
        at Object.invoke (/bower_components/angular/angular.js:4443:17)
        at /bower_components/angular/angular.js:4261:37
        at getService (/bower_components/angular/angular.js:4402:39)
        at Object.invoke (/bower_components/angular/angular.js:4434:13)
        at /bower_components/angular/angular.js:4261:37
        at getService (/bower_components/angular/angular.js:4402:39)
        at Object.invoke (/bower_components/angular/angular.js:4434:13)
        at /bower_components/angular/angular.js:4261:37
        at getService (/bower_components/angular/angular.js:4402:39)

Observe que usamos jQuery junto com Angular.

Isso poderia estar relacionado a https://github.com/angular/angular.js/commit/75373dd4bdae6c6035272942c69444c386f824cd?

@nikrolls

angular.element (...). data não é uma função

Eu entendi direito que angular.element(...) (que tem o alias de jQuery(...) se você carregar o jQuery antes do Angular) retorna algo que não tem o método data ? Isso parece estranho. Você poderia habilitar "quebra nas rejeições" no Chrome DevTools e então, quando você atingir esta linha, verifique o que exatamente retorna as seguintes expressões:

  1. angular.element
  2. angular.element(...) (substitua os pontos pelo que você realmente tem)
  3. ... (substitua os pontos pelo que você tinha em angular.element )

Obrigado!

Temos um problema semelhante desde o angular v1.5.1.

should update data with success with redirect
          PhantomJS 2.1.1 (Linux 0.0.0)
        TypeError: undefined is not an object (evaluating '$location.path(interpolate(nextRoute.redirectTo, nextRoute.params)).search') in /project/app/bower_components/angular-route/angular-route.js (line 601)
        commitRoute@/project/app/bower_components/angular-route/angular-route.js:601:82
        $broadcast@/project/app/bower_components/angular/angular.js:17207:33
        afterLocationChange@/project/app/bower_components/angular/angular.js:13127:28
        /project/app/bower_components/angular/angular.js:13113:32
        $eval@/project/app/bower_components/angular/angular.js:16884:28
        $digest@/project/app/bower_components/angular/angular.js:16700:36
        flush@/project/app/bower_components/angular-mocks/angular-mocks.js:1779:45
        /project/app/modules/main/partners/partners.spec.js:338:31
        invoke@/project/app/bower_components/angular/angular.js:4625:24
        workFn@/project/app/bower_components/angular-mocks/angular-mocks.js:2933:26
        Error: [$rootScope:inprog] $digest already in progress
        http://errors.angularjs.org/1.5.1/$rootScope/inprog?p0=%24digest (line 17242)
        beginPhase@/project/app/bower_components/angular/angular.js:17242:88
        $digest@/project/app/bower_components/angular/angular.js:16680:19
        flush@/project/app/bower_components/angular-mocks/angular-mocks.js:1779:45
        /project/app/modules/main/partners/partners.spec.js:385:39
        invoke@/project/app/bower_components/angular/angular.js:4625:24
        workFn@/project/app/bower_components/angular-mocks/angular-mocks.js:2933:26
        inject@/project/app/bower_components/angular-mocks/angular-mocks.js:2902:46
        /project/app/modules/main/partners/partners.spec.js:381:23
        undefined

Nesse caso, o erro é sempre gerado quando os testes incluem a função inject() . Acho que spyOn($location, 'path'); na função beforeEach pode ser o problema.

describe('ctrl test', function () {
    beforeEach(inject(function ($controller, $location) {
        spyOn($location, 'path');
    }));

    describe('save()', function () {
        it('should work', function(){
            inject(function ($location) {
                // some test code
            });
        });
    });
});

@ 4kochi - seu problema é que você espionou uma função, mas não forneceu uma implementação para o espião. Em outras palavras, chamar spyOn($location, path); substitui o método $location.path por uma função espiã, mas essa função espiã retorna undefined . Mais tarde, o roteador está tentando acessar $location.path().search , que está efetivamente dizendo undefined.search .

Você precisa fornecer uma implementação para o espião: uma falsa ou uma passagem:

spyOn($location, 'path').andCallThrough();
spyOn($location, 'path').andCallFake(function(url) { return {...}; });

Obrigado pela dica @petebacondarwin. Tive uma ideia semelhante. Mas eu me pergunto então por que exatamente o mesmo código de teste funciona com Angular 1.5.0? Perdi algo?

Tenho o mesmo problema quando uso inject , por exemplo

  beforeEach(inject(function($rootScope) {

  }));

@ dagda1 , você poderia fornecer as informações mencionadas em https://github.com/angular/angular.js/issues/14251#issuecomment -198276079 (bem como o rastreamento de pilha exato para o erro)?

Eu estava vendo esse problema também em nossos testes depois de tentar atualizar para a v1.5.2. Alterando a linha 2776 do angular-mocks.js de:
angular.element.cleanData(cleanUpNodes);
Para:
if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes);

Corrija o problema. Em nosso caso, estamos tentando espionar o angular.element por vários motivos.

Em nosso caso, estamos tentando espionar o angular.element por vários motivos.

Isso explica o erro.

angular.element é um "recurso" bastante básico e muito utilizado internamente. Eu não recomendaria apagá-lo. (Espiar e deixar as coisas passarem deve ser OK).

BTW, alterar o código para if (angular.element.cleanData) angular.element.cleanData(cleanUpNodes); leva a vazamentos de memória que podem causar o travamento do carma em conjuntos de teste enormes.
(Sim, já aconteceu: smiley :)

Obrigado @gkalpak - infelizmente qualquer tipo de espião (mesmo aquele que só liga) parece causar o mesmo problema. Existe alguma outra solução em andamento ou outras sugestões para tentar?

@KeithPepin angular.element é uma fera traiçoeira. Você realmente precisa espioná-lo? Você pode dar um exemplo de seus testes?

Eu tenho o mesmo problema.
obter alguma mensagem de erro:

PhantomJS 2.1.1 (Linux 0.0.0) 首页单元测试 首页内容控制器测试 调用获取数据接口 encountered a declaration exception FAILED
    ReferenceError: Can't find variable: module in /client/modules/bootstrap/test/bootstrap.spec.js (line 4)
    /client/modules/bootstrap/test/bootstrap.spec.js:4:23
    global code@/client/modules/bootstrap/test/bootstrap.spec.js:3:9
PhantomJS 2.1.1 (Linux 0.0.0): Executed 1 of 1 (1 FAILED) ERROR (0.041 secs / 0.001 secs)

meu teste da seguinte forma:

describe( '首页模块单元测试', function(){

    var $httpBackend,
        $indexFactory;

    beforeEach( module( 'Datatao.bootstrap' ) ); 

    beforeEach( inject( function( _$httpBackend_,  _IndexFactory_ ){ 
        $httpBackend    = _$httpBackend_;
        $indexFactory   = _IndexFactory_;
    }) ); 

    describe( '首页内容控制器测试', function(){
        it( '调用获取数据接口', function(){
            expect( true ).toBe( true ); 
        });
    });

});

e eu uso o angular 1.4.8 e ui-router 0.2.15 angular-mocks 1.5.2, mas após o downgrade do angular-mocks para 1.5.0, tudo bem.
se precisar de mais informações, por favor @me

@terminatorheart Não oferecemos suporte ao uso de versões do angular e do angular-mock que não combinam. Você tentou usar 1.5.2 para ambos?

Tentei recriar esse problema aqui https://github.com/petebacondarwin/issue-14251
Mas karma start funciona bem para mim. Você pode sugerir o que mais precisa estar no projeto para que ele falhe?

Estou recebendo erros semelhantes ao mudar de 1.5.0 para 1.5.1.

temos o seguinte código para fazer algum trabalho adicional antes que o aplicativo seja inicializado. agora está falhando com o erro abaixo.

var injMods = ['ng', 'tcpInitModule', 'mpyInitModule'];
var initInjector = angular.injector (injMods);

var tcpMembershipSvc = initInjector.get ('tcpMembershipSvc');
// faça algum trabalho com o provedor tcpMembershipSvc

// finalmente bootstrap
angular.bootstrap (documento, ['tcpMainModule']);

Erro:
Erro não detectado : [$
http://errors.angularjs.org/1.5.1/ $ injector / unc? p0 =% 24rootElementProvider%…% 24rootElement% 20% 3C-% 20% 24location% 20% 3C-% 20% 24route% 20% 3C- % 20% 24location

Em testes de unidade, ele falha com o erro abaixo.
Erro: [$ injector: modulerr ] Falha ao instanciar o módulo ng devido a:
TypeError: 'undefined' não é um objeto (avaliando 'Function.prototype.bind.apply')
na instância (c: /app/internal_packages/angular/angular.js: 4640)

@mlakmal, você poderia criar uma demonstração executável do seu problema para que pudéssemos testar?

@petebacondarwin adicionei o plnker abaixo.

https://plnkr.co/edit/J32cQo4Fo9fkiRH3pF3L?p=preview

Também percebi que o erro de teste de unidade também vem na v1.5.0 ...

@mlakmal Acho que o problema no plnkr é diferente do problema do teste de unidade. Provavelmente tem algo a ver com as mudanças no ngRoute.

O problema do teste de unidade parece ser devido a Function.prototype.bind ser indefinido. Você está usando o PhantomJS 1.x?

Seu outro problema está de fato (mais ou menos) relacionado à mudança ngRoute (5e37b2a) - na verdade, ele está expondo um problema que já está presente.

Uma reprodução mínima é: angular.injector(['ng', 'ngRoute'])
Outra reprodução mínima (não envolvendo ngRoute ) seria: angular.injector(['ng']).get('$location');

O problema é que o serviço $location depende de $rootElement . O $rootElement não é fornecido pelo Angular até que um aplicativo seja inicializado (porque ele não é conhecido antes disso). Tentar instanciar $location fora do contexto de um aplicativo bootstraped fará com que o injetor tente obter o $rootElement e falhe, porque naquele ponto não há provedor para $rootElement .

TBH, não consigo pensar em um motivo para carregar ngRoute de um injetor personalizado ( @mlakmal, estou muito interessado em saber mais detalhes sobre o seu caso de uso, mesmo que apenas OOC: smiley :).

Uma solução simples é incluir um módulo extra fictício que fornece um $rootElement :

angular.module('fakeRootElement', []).value('$rootElement', angular.element('<div></div>'));
var initInjector = angular.injector(['ng', 'InitModule', 'fakeRootElement']);

Plnkr atualizado

Agora, na questão real, $location usa $rootElement para interceptar todos os click eventos e tratá-los no modo HTML5. Poderíamos tornar isso uma dependência "opcional" (por exemplo, injetar $rootElement apenas se estiver definido ou fornecer um $rootElement fictício e substituí-lo durante o bootstrap).
A questão é devemos?

HI @gkalpak , você está correto, estamos usando o Phantom JS 1.9.8 e tentando mudar para v2, mas está ficando atrasado do nosso lado devido às mudanças de versão do nó necessárias nos agentes de construção (ainda estamos no nó v0.12.x) . Eu atualizei PhantomJS localmente para v2 e meus testes de unidade parecem bons. alguma ideia de como consertar o problema do PhantomJS 1?

Sua solução alternativa funcionou bem para corrigir o problema no injetor. Posso viver com essa correção até que mudemos para o AngularJS 2 no futuro (sonhando ...).

Em relação ao nosso caso de uso para ngRoute: temos alguns serviços que usam provedores de ngRoute nesses CommonModule e InitModule. portanto, tivemos que adicionar ngRoute como dependência de módulo para esses módulos ao criar para oferecer suporte a execuções de teste de unidade. Acho que podemos removê-lo dessas dependências e adicionar ngRoute apenas quando for exigido pelo teste de unidade.

Os problemas de teste de unidade do PhantomJS 1 foram resolvidos após adicionar o seguinte polyfill para karma conf. Não sei por que esse erro veio repentinamente após a atualização do angular 1.5.x ...

https://www.npmjs.com/package/phantomjs-polyfill

@mlakmal , o motivo pelo qual esse problema com o PhantomJS não apareceu antes, é que o Angular não usava Function.prototype.bind . Fazemos agora, pois é necessário para oferecer suporte a classes nativas e todos os navegadores com suporte o fornecem. (Observe que PhantomJS não é explicitamente suportado, o que significa que não testamos contra ele, mas muitas pessoas o usam (incluindo o projeto ngMaterial até algum tempo atrás) sem problemas.)

Sobre confiar em ngRoute em InitModule :
ngRoute fornece apenas um provedor ( $routeProvider ), que é útil apenas para registrar rotas. Ainda não entendo por que você precisa criar seu próprio injetor incluindo-o (considerando que cada injetor criará uma instância diferente do serviço - os serviços são únicos com cada injetor).
Se você estiver carregando InitModule apenas para obter alguns serviços auxiliares, pode ser uma ideia melhor extrair esses serviços auxiliares em um módulo autônomo (do qual InitModule depende) e, em seguida, carregue apenas esse módulo auxiliar em seu injetor extra.

@gkalpak estamos usando $ routeParams do ngRoute em nossas diretivas. então é por isso que o adicionamos a alguns dos módulos ... mas acho que podemos adicionar o módulo ngRoute aos nossos arquivos de especificação separadamente.

@mlakmal , meu ponto é que não consigo ver como ngRoute é necessário em seu injetor extra que você cria manualmente (usando angular.injector([...]) ), uma vez que seria um injetor separado (com serviço separado instâncias) do injetor do seu aplicativo.

Ei pessoal, desculpem por tocar no assunto novamente depois de alguns dias, mas acabei de encontrar isso.

Estou espionando angular.element com todas as ligações, mas ainda não está funcionando, infelizmente.

spyOn( angular, 'element' ).andCallThrough();

Alguma ideia?

@mattgrande Estou pensando que não podemos fazer muito sem uma demonstração. ;)

Isso não é um problema com Jasmine 2.x btw, porque ele copia todas as propriedades da função espiada para o espião (veja demo ).

Ainda é um problema com Jasmine 1.x, que não copia propriedades (veja demo ).
Você pode contornar isso copiando você mesmo as propriedades (todas ou apenas as necessárias, por exemplo, cleanData ):

spyOn(angular, 'element').andCallThrough();

// Copy all properties
angular.extend(angular.element, angular.element.originalValue);
// or
// Copy `cleanData` only
angular.element.cleanData = angular.element.originalValue.cleanData;

TBH, pretendo fechá-lo como works as expected / won't fix . angular.element() é muito fundamental e se alguém está espionando, é melhor estar preparado para BCs (ou use Jasmine 2: hung_out_tongue :)

Também seria fácil contornar isso dentro de ngMock , por exemplo, alterar angular.element.cleanData(...) para algo como:

var ngEl = angular.element;
(ngEl.cleanData || (ngEl.originalValue && ngEl.originalValue.cleanData) || angular.noop)(...)

Mas amanhã pode haver outra biblioteca de teste quebrando.

Então, desde:

(a) é apenas um problema com Jasmine 1.x (não 2.x),
(b) só quebra os testes, não o código do aplicativo e
(c) é tão fácil de consertar,

Eu (ainda) inclino-me a não "consertar" isso.

@gkalpak Estou inclinado a concordar com você. Este é outro caso para a "página de problemas conhecidos", não?

usou a solução @KeithPepin ,

if (angular.element.cleanData)
angular.element.cleanData (cleanUpNodes);

trabalhou para mim

Obrigado por isso, pessoal. Vou tentar atualizar para Jasmine 2.x (não há _muito_ mudanças), mas se isso provar ser muito chato, usarei a solução de Keith.

Atualização: Acontece que eu já estava no Jasmine 2.1, mas atualizei para o mais recente e não afetou nada.

Acabei usando o método " @gkalpak . Obrigado!

@mattgrande , para qual versão do jasmim você atualizou? É estranho que não funcionou, porque parece funcionar bem na minha demonstração com jasmine v2.4.1: confused:

mesmos erros com simulações angulares 1.5.2 e 1.5.3
(Jasmim 2.4.1)

Jasmine 2.4.0; Angular versão 1.5.2

Olá, também estou tendo problemas indefinidos com PhantomJS2, karma e jasmim. Estou usando as versões mais recentes de karma e jasmim. Meu aplicativo também usa o ngRoute.

Meu problema surge quando tento injetar $ rootScope e $ controller. Estou usando o ngMock para simular um dos meus módulos. escopo e controlador são sempre indefinidos. No entanto, quando eu testo apenas o módulo usando angular.module, os testes são aprovados. Não estou usando o spyOn.

Alguma sugestão sobre qual poderia ser o erro?

Também estou tendo esse problema ao atualizar de 1.4.6 para 1.5.3.

Um de vocês pode fornecer uma demonstração executável do problema?

@petebacondarwin aqui está a compilação travis falhada: https://travis-ci.org/prestonvanloon/newrelic-angular/builds/118604417

Editar: aqui está o PR que o causou https://github.com/prestonvanloon/newrelic-angular/pull/28

@prestonvanloon , seu problema é que você está usando diferentes versões de angulares e angulares-mocks.
Você sempre deve usar versões correspondentes.

@gkalpak obrigado!

@prestonvanloon : Verifique a versão do angular e do angular-mocks que você está usando. Eu estava enfrentando o mesmo problema. Quando eu estava usando o angular-mocks versão 1.5.5 e a versão angular era 1.4.7, tive a mesma exceção. Quando atualizei minha versão angular para 1.5.5, não obtive nenhum erro e todos os testes foram executados com êxito.

Obrigado @ varun85jobs e @gkalpak , esse foi exatamente o meu problema

Ei pessoal, eu tenho um projeto Ionic com angular versão 1.5.3 e angular-mocks 1.5.3, mas ainda recebo o mesmo erro. O que poderia ser?

Olá, mesmo problema aqui, acabei de tentar com 1.5.5 e 1.5.3 e continuo com problemas, como solução temporal usamos 1.5.0.

A resposta de KeithPepin consertou para mim, mas prefiro não alterar o código de uma biblioteca

Ainda não temos um caso de uso adequado para espionar angular.element . Sem isso, não podemos avançar com uma correção.

Há uma pergunta sobre esse assunto aqui também.
Minha resposta daí, caso ajude alguém aqui:

Eu tive o mesmo problema e o que me corrigiu foi carregar o jquery em meus testes:

files: [
      'bower_components/jquery/dist/jquery.js',
      'bower_components/angular/angular.js',
      'bower_components/angular-mocks/angular-mocks.js',
...
]

tirou a ideia deste comentário porque também usamos jQuery junto com o Angular.

Ainda precisamos de uma reprodução real em execução, onde todas as versões dos módulos angulares usados ​​coincidam.

Eu tenho este problema: angular.element.parent não é uma função

@ kristoff2016 , isso não parece o mesmo problema. Abra uma nova edição, fornecendo mais informações, por exemplo, o código relevante, a mensagem de erro exata, seu ambiente (navegador, sistema operacional etc.). As reproduções ao vivo (usando CodePen, Plnkr etc) também são muito apreciadas: sorriso:

No meu caso, o problema era que eu estava usando uma versão antiga do karma-phantomjs-launcher (^ 0.1.4 em vez de ^ 1.0.0) que dependia de uma versão mais antiga do PhantomJS. Com [email protected] , ele está funcionando corretamente.

+1 atualizando karma-phantomjs-launcher e phantomjs para 2+ resolveu

A única opção que funcionou para mim até agora foi fazer o downgrade para angular / angular-mocks 1.5.0

Já se passaram meses desde que isso foi relatado pela primeira vez e ainda não há reprodução real (com versões correspondentes) postada aqui !! Não podemos consertar o que não podemos ver. :preocupado:

Vou fechar isto, mas ficaria feliz em reabrir se conseguirmos uma reprodução.

Olá @gkalpak , obrigado por evil :. Eu salvei neste plnkr . Portanto, o código a seguir pode não fazer muito sentido para você, mas fizemos isso como uma solução alternativa para uma situação muito específica:

var elSelect = angular.element;
angular.element = function(id) {
        try {
            return elSelect.call(angular, id);
        } catch(err) {
            return $(id);
        }
    };

Portanto, isso funciona para a versão 1.5.0 do angular e do angular-mocks durante o teste, mas não para 1.5.1-1.5.7 . Não sei se é esse caso específico ou se outros casos usando angular.element também podem falhar.

Thx @vitorarins. Como mencionado antes, é uma coisa muito "impertinente" substituir um componente certificado como angular.element e não pelo menos preservar suas propriedades. Usando a técnica angular.extend() descrita acima, você se sairia bem.

var ngElement = angular.element;
angular.element = angular.extend(function(id) {
  try {
    return ngElement.call(angular, id);
  } catch(err) {
    return $(id);
  }
}, ngElement);

Plnkr atualizado

Muito obrigado @gkalpak! Espero que pelo menos isso sirva de referência para outras pessoas com esse problema. Mais uma vez, muito obrigado!

Olá, também estou enfrentando o mesmo problema. Mas usando seleção angular. No meu controlador, estou inicializando o select assim.
angular.element ('selecionar'). select2 ();

Adicionado espião da seguinte forma:
var ngElement = angular.element ('selecionar');
angular.element = angular.extend (function (id) {
tentar {
retornar ngElement.call (angular, id);
} catch (errar) {
return $ (id);
}
}, ngElement);

spyOn (ngElement, 'select2'). and.callFake (function () {

    });

PhantomJS 2.1.1 (Mac OS X 0.0.0) ERRO
TypeError: tentativa de atribuir a propriedade somente leitura.
em /node_modules/angular/angular.min.js:9

Eu já passei por toda essa postagem e usei o angular 1.5.7 e o jasmine 2.4.1. Mas ainda o problema não foi resolvido.

@lathaMaramganti Não é:

var ngElement = angular.element('select');

mas:

var ngElement = angular.element;

Você precisa salvar a função original para estendê-la, não sua invocação.

Esta página foi útil?
0 / 5 - 0 avaliações