我正在构建一个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
:错误:'无法读取未定义'
答案 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);
});
};
});