AngularJS:在e2e测试中访问$scope对象
我正在构建一个数学教程应用程序,并希望使用angular的e2e测试套件测试我的UI 目前,我正在制作一个分数页面,该页面生成一个随机分数,显示一系列着色和非着色框,并要求用户输入由着色形成的分数 使用e2e测试,我想测试UI如何响应正确和不正确的输入;然而,由于分数在页面加载时是随机的,所以我不知道测试内部的“正确”输入是什么 要获得输入的正确答案,最简单的方法是访问位于控制器AngularJS:在e2e测试中访问$scope对象,angularjs,angularjs-e2e,Angularjs,Angularjs E2e,我正在构建一个数学教程应用程序,并希望使用angular的e2e测试套件测试我的UI 目前,我正在制作一个分数页面,该页面生成一个随机分数,显示一系列着色和非着色框,并要求用户输入由着色形成的分数 使用e2e测试,我想测试UI如何响应正确和不正确的输入;然而,由于分数在页面加载时是随机的,所以我不知道测试内部的“正确”输入是什么 要获得输入的正确答案,最简单的方法是访问位于控制器$scope.problemObject的分数对象,并调用其API函数.getNumerator()和.getDeno
$scope.problemObject
的分数对象,并调用其API函数.getNumerator()
和.getDenominator()
。然而,我还没有找到一种方法从我的测试中访问这个对象
我的控制器的相关线路包括:
$scope.problemObject = Fraction.random();
// This produces an object with two relevant
// functions (getNumerator() & getDenominator())
我尝试过的
binding()
binding()
可以满足我的需要,但是对binding('problemObject')
或binding('problemObject.getNumerator()的所有调用“
等发出一个错误,表示无法找到绑定。我怀疑这是因为$scope.problemObject
和$scope.problemObject.getNumerator()的返回值未直接绑定到UI
angular.element().scope()
从我正在测试的页面上的控制台执行angular.element('#problem').scope().problemObject
,效果非常好;但是,从我的测试中尝试同一行会出现以下错误:“选择器未实现”
我还尝试了一些变化:
元素(“#问题”).scope().problemObject
:错误:“对象”没有方法“scope”
angular.element(element(“#problem”)).scope().problemObject
:错误:“无法读取未定义的”的属性“problemObject”我猜e2e测试中的“element”和“angular.element”是不同的对象。
您可能需要尝试从视图中读取值
如果是输入字段
var value = element('#problem').val();
否则,类似于:
var value = element('#problem').text();
(在我看来,从e2e查看范围对象是一种欺骗。)
编辑
我完全误解了网页的问题和结构。
很抱歉给你带来了困惑。
它必须根据着色框和非着色框的编号验证输入字段(本例中为“td”元素)
想法是一样的,它试图从视图中获取数字,而不是从$scope中获取数字。结果表明,问题在于存储在jQuery的数据中的范围。由于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);
});
};
});
问题是我需要的值(分数的分子和分母)不直接绑定到DOM。它们存在于悬挂在控制器作用域之外的分数对象中。它们的值在运行时通过随机化例程确定。通常,我在e2e测试中不需要这些值;但是,我想测试UI对正确和不正确输入的响应。测试无法知道什么是正确的t input是,除非它能以某种方式访问这些值。我总是可以将它们放在数据-
元素中进行测试,但我希望有更好的解决方案。如果您不清楚我的建议,很抱歉。如果显示数字,则表示它是dom树的一部分(或者是图像还是其他?)。你不能直接访问文本元素吗?这就是我的意思。例如,如果它是“{number}”,那么我可以使用jquery通过“$('span').text()”访问该数字。谢谢你坚持我的观点。页面上唯一的元素(除了一些说明文本)是两个输入框(用于用户的分子和分母答案)和一个可视的文本(没有任何文本数据的HTML表格)它表示分数。我可以使用可视化工具来推断控制器中分数对象的状态,但这会将真理的来源移动到自定义指令的输出,这本身可能有缺陷。您可以在此处看到该页面的原型、非随机版本:我根据对t的正确理解来编辑我的响应view.binding()只适用于在HTML文档中查找{{bindingName}}表达式的值。这通常是一个原语,而不是一个对象。你解决过这个问题吗?我遇到过类似的问题,不知道为什么会被否决。这是一个很好的解决问题的方法,对我来说很有用。
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);
});
};
});