7

我制定了一个指令,用于向用户显示通知消息。为了显示我写的通知:

$scope.$watch($messaging.isUpdated, function() {
    $scope.messages = $messaging.getMessages();
    if ($scope.messages.length > 0) {
        $timeout(function() {
            for (var i = 0; i < $scope.messages.length; i++) {
                if (i + 1 < $scope.messages.length) {
                    $messaging.removeMessage($scope.messages[i]);
                } else {
                    $messaging.removeMessage($scope.messages[i]);
                }
            }
        }, 5000);
    }
});

我使用 $timeout 来确保消息在屏幕上停留 5 秒。

现在我想对其进行端到端测试,以便确保显示通知。问题是当显示通知时,端到端也像通知消息一样超时。这使得无法检查是否显示了正确的通知。.

这是我的测试代码:

it('submit update Center', function() {
    input('center.Name').enter('New Name');
    input('center.Department').enter('New Department');
    input('center.Contact').enter('New contact');
    input('center.Street').enter('New street');
    input('center.City').enter('New city');
    input('center.Country').enter('New Country');
    element('button#center_button').click();

    expect(element('.feedback').count()).toBe(1);
    expect(element('.feedback:first').attr('class')).toMatch(/success/);

    expect(element('.error.tooltip').count()).toBe(0);
});

我想避免使用 javascript setTimeout() 并希望有另一个(Angular)解决方案来解决这个问题。

4

2 回答 2

11

坏消息,伙计。这是 AngularJs 中的一个已知问题。这里有讨论,这里有一个“某种程度上相关”的问题

幸运的是,您可以通过汇总自己的$timeout服务、手动调用setTimeout和调用来解决此$apply问题(这是我提到的讨论中的建议)。这真的很简单,虽然它真的很丑。一个简单的例子:

app.service('myTimeout', function($rootScope) {
  return function(fn, delay) {
    return setTimeout(function() {
      fn();
      $rootScope.$apply();
    }, delay);
  };
});

请注意,这与 Angular 不兼容$timeout,但您可以根据需要扩展您的功能。

于 2013-04-21T14:42:50.490 回答
0

关于你的小便条 if/else 语句

$scope.$watch($messaging.isUpdated, function() {
$scope.messages = $messaging.getMessages();
if ($scope.messages.length > 0) {
    $timeout(function() {
        for (var i = 0; i < $scope.messages.length; i++) {
            if (i + 1 < $scope.messages.length) {
                $messaging.removeMessage($scope.messages[i]);
            } else { /**** unnecessay else here *****/
                $messaging.removeMessage($scope.messages[i]);
            }
        }
    }, 5000);
}});
于 2013-04-26T21:36:39.183 回答