Unit Test Angularjs Direktive, die ein privates Timeout enthält, mit Jasmine

Ich habe eine Anweisung, die sich anders verhalten sollte, je nachdem, wie viel Zeit seit der Initialisierung vergangen ist:

am.directive('showText', () => ({
  restrict: 'E',
  replace: true,
  scope: {
    value: '@'
  },
  controller: ($scope, $timeout) => {
    console.log('timeout triggered');

    $scope.textVisible = false;

    let visibilityCheckTimeout = $timeout(() => {
      if (parseInt($scope.value, 10) < 100) {
        $scope.textVisible = true;
      }
    }, 330);

    // Clear timeout upon directive destruction
    $scope.$on('$destroy', $timeout.cancel(visibilityCheckTimeout));
  },
}));

Das Problem ist, dass ich beim Versuch, es mit Jasmine zu testen, keine Möglichkeit finde, dieses Timeout in irgendeiner Weise auszulösen. Schon ein @ ausprobie$timeout.flush() und$timeout.verifyNoPendingTasks() (was eigentlich einen Fehler auslöst, wenn ich @ kommentieren werflush Anruf). Aber es löst immer noch nicht die Callback-Ausführung dieses Timeouts aus

describe('showText.', () => {
  let $compile;
  let $rootScope;
  let $scope;
  let $timeout;

  const compileElement = (rootScope, value = 0) => {
    $scope = rootScope.$new();
    $scope.value = value;

    const element = $compile(`
      <show-text
        value="value"
      ></show-text>
    `)($scope);

    $scope.$digest();

    return element;
  };

  beforeEach(() => {
    module('app.directives.showText');

    inject((_$compile_, _$rootScope_, _$timeout_) => {
      $compile = _$compile_;
      $rootScope = _$rootScope_;
      $timeout = _$timeout_;
    });
  });

  it(`Process lasts > 0.33s. Should show text.`, () => {
    const VALUE = 30;
    const element = compileElement($rootScope, VALUE);
    const elementContent = element.find('.show-text__content');

    $timeout.flush(1000);

    $timeout.verifyNoPendingTasks();

    $rootScope.$digest();

    expect(element.isolateScope().textVisible).toBeTruthy();
    expect(elementContent.length).toEqual(1);
    expect(elementContent.text().trim()).toBe('Example text');
  });
});

Test schlägt fehl.

Kann nicht finden, was ich falsch mache. Irgendwelche Tipps, wie man einen solchen Fall richtig testet?

Vielen Dank

UPD Nach einigen Nachforschungen habe ich festgestellt, dass in diesem speziellen Testfall incompileElement Funktion,value Eigenschaft wird nicht von @ ausgewert$compile Bedienung. Und gleich"value". Ich habe dieselbe Funktion bereits zum zehnten Mal verwendet und kann nicht verstehen, warum es kein @ brauch$scope.value 's Eigentum wie es vorher war.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage