1

我正在构建一个数学辅导应用程序,并想使用 Angular 的 e2e 测试套件来测试我的 UI。

目前我正在制作一个分数页面,该页面生成一个随机分数,显示一系列阴影和非阴影框,并要求用户输入由阴影形成的分数。

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

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

我的控制器的相关行是:

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

我试过的

  • binding()

最初我认为binding()会做我需要的事情,但是所有对binding('problemObject')orbinding('problemObject.getNumerator()'的调用都会发出一个错误,指出无法找到绑定。我怀疑这是因为$scope.problemObject它的返回值$scope.problemObject.getNumerator()没有直接绑定到 UI。

  • angular.element().scope()

angular.element('#problem').scope().problemObject从我正在测试的页面上的控制台执行完美;但是,在我的测试中尝试同一行会出现以下错误:“选择器未实现”。

我也尝试了一些变化:

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

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

4

2 回答 2

0

我猜 e2e 测试中的 '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。

于 2012-08-15T03:13:09.690 回答
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);
        });
    };
});
于 2013-02-28T05:43:37.457 回答