0

我试图在 E2E 测试中访问 $scope,但没有成功...

作为测试,我尝试了这个:(我的网站不使用 JQuery ..)

跑步者将我的网站放在一个嵌套的 iframe 中,所以我直接访问它,然后获取所有 ng-scopes 并在它们上尝试 .scope() ,如本文和下面的代码中所示......

var frameDocument = document.getElementById('test-frames').children[0].contentDocument;
var scopeElements = frameDocument.getElementsByClassName('ng-scope');
var scopes = [].map.call(scopeElements, function (e) {
return angular.element(e).scope();
});

上面的代码找到了正确的元素,但是对它们调用 scope() 会为每个返回 undefined ....

有人可以确认或否认我们可以访问 E2E 中的范围吗?我想有办法吗?

谢谢

4

2 回答 2

3

这是我基于先前答案的技巧。

您可以将其扩展到动态范围。主要部分是从 addFutureAction 获取对 appWindow 的引用。

//HTML CODE

<body id="main-controller" ng-controller="mainCtrl" ng-init="__init__()">


//Scenario helper.

/*
Run `callback` with scope from `selector`.
*/
angular.scenario.dsl('scope', function() {
    return function(selector, callback) {
        return this.addFutureAction(
            'Executing scope at ' + selector,
            function(appWindow, $document, done) {
                var body = appWindow.document.getElementById(selector)
                var scope = appWindow.angular.element(body).scope()
                callback(scope)
                scope.$apply()
                done(null, 'OK');
            })
    }
})

//Actual test.

it(
'When alerts are defined, they are displayed.',
function() {
    scope('main-controller', function(scope) {
        scope.alerts.push({'type': 'error', 'msg': 'Some error.'})
    })

    expect(element('#alerts').css('display')).toEqual('block')
})
于 2013-06-30T09:45:32.780 回答
2

在 E2E 测试中,以这种方式访问​​范围并不是一个好的选择。相反,您可以使用辅助功能,例如element()选择页面中的元素,并用于expect()检查模型数据。

您可能需要的是单元测试。您可以$scope轻松地在单元测试中访问。

这里有一个很好的指南:http ://www.yearofmoo.com/2013/01/full-spectrum-testing-with-angularjs-and-testacular.html

也可能是时间问题,我可以像这样到达睾丸跑步者的范围。它在 iframe 中运行测试。要使其工作,您需要添加sleep(3)到您的测试中。但这是非常脆弱的。

    setTimeout(function () {
        console.log('try to reach frames');
        var frame = window.frames[0].window.frames['senario_frame'];
        if (!frame) {
            console.log('too late');
        } else {

            var scopeElements = frame.document.getElementsByClassName('ng-scope');
            var scopes = [].map.call(scopeElements, function (e) {
                return frame.angular.element(e).scope();
            });
            console.log(scopes);
        }
    }, 2000);
于 2013-04-14T15:29:41.127 回答