AngularJS:在e2e测试中访问$ scope对象

时间:2012-08-14 19:37:40

标签: angularjs angularjs-e2e

我正在构建一个Math辅导应用程序,并希望使用angular的e2e测试套件测试我的UI。

目前我正在处理一个生成随机分数的Fraction页面,显示一系列带阴影和无阴影的框,并要求用户输入由阴影形成的分数。

使用 e2e测试,我想测试UI如何响应正确和错误的输入;但是,由于分数在页面加载时是随机的,我不知道测试内部的“正确”输入是什么。

我获得输入正确答案的最简单方法是访问位于控制器$scope.problemObject的Fraction对象,并调用其API函数.getNumerator()和{{1 }}。但是,我没有找到从我的测试中获取此对象的方法。

我的控制器的相关行是:

.getDenominator()

我尝试过什么

  • $scope.problemObject = Fraction.random(); // This produces an object with two relevant // functions (getNumerator() & getDenominator())

最初我认为binding()可以执行我需要的操作,但是对binding()binding('problemObject')等的所有调用都会发出错误,指出无法找到绑定。我怀疑这是因为binding('problemObject.getNumerator()'并且$scope.problemObject的返回值没有直接绑定到UI。

  • $scope.problemObject.getNumerator()

从我正在测试的页面上的控制台执行angular.element().scope()工作正常;但是,在我的测试中尝试相同的行发出以下错误:'选择器未实现'。

我也试过了一些变化:

angular.element('#problem').scope().problemObject:错误:'对象#没有方法'范围''

element('#problem').scope().problemObject:错误:'无法读取未定义'

的属性'problemObject'

2 个答案:

答案 0 :(得分:0)

我猜e2e test中的'element'和'angular.element'是不同的对象。 您可能想尝试从视图中读取值。

如果是输入字段。

var value = element('#problem').val();

否则,例如:

var value = element('#problem').text();

(在我看来,从e2e调查范围对象是一种欺骗行为。)

修改

我完全误解了网页的问题和构造。 对困惑感到抱歉。 它需要验证的是输入字段与阴影和非阴影框的数字(在此示例中为“td”元素)。

var total = element('td').count()
  , fraction = element('td.shaded').count();

理念是一样的,它试图从视图中获取数字,而不是从$ scope。

答案 1 :(得分:0)

原来问题在于存放在jQuery data中的范围。由于jQuery将数据存储在哈希表中$.cache全局,因此一旦我们在运行测试网页的框架之外,我们就无法访问它们。我解决它的方法是访问iframe窗口中的jQuery(方便地在$window参数中给出)。

以下是我提出的访问范围的内容。您可以scope('#myElement', 'foo.bar')查询$scope.foo.bar

angular.scenario.dsl('scope', function() {
return function(selector, entry) {
    return this.addFutureAction('find scope variable for \'' + selector + '\'', 
        function($window, $document, done) {
            var $ = $window.$; // jQuery inside the iframe
            var elem = $(selector);
            if (!elem.length) {
                return done('No element matched \'' + selector + '\'.');
            }
            var entries = entry.split('.');
            var prop = elem.scope();
            for (var i in entries) {
                prop = prop[entries[i]];
            }
            done(null, prop);
        });
    };
});