加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – Karma – 单元测试Angular JS指令时div的ui属性不

发布时间:2020-12-17 06:50:47 所属栏目:安全 来源:网络整理
导读:我正在为一个指令编写测试,该指令基本上扩展了它的容器以达到浏览器窗口的整个宽度. 为了举例说明,我将编写一些示例代码. 页面中的HTML: div style="width: 800px; margin: 0 auto;" full-width/full-width/div 然后该指令将fullWidth指令替换为: div clas
我正在为一个指令编写测试,该指令基本上扩展了它的容器以达到浏览器窗口的整个宽度.

为了举例说明,我将编写一些示例代码.

页面中的HTML:

<div style="width: 800px; margin: 0 auto;">
  <full-width></full-width>
</div>

然后该指令将fullWidth指令替换为:

<div class="full-width">
  <div ng-transclude=""></div>
</div>

并为元素指定边距,如下所示:

var sideOffset = element[0].offsetLeft*-1;

element.css('margin-left',sideOffset+'px')
element.css('margin-right',sideOffset+'px')

现在,该指令完全正常,但当我尝试使用以下方法测试偏移:

describe('Directive: fullWidth',function () {

  beforeEach(module('myApp'))

  var element,scope

  beforeEach(inject(function ($rootScope) {
    scope = $rootScope.$new()
  }))

  it('should have the same right and left margin',inject(function ($compile) {
    element = angular.element('<tt-full-width-section></tt-full-width-section>');
    element = $compile(element)(scope)

    var leftMargin = element.css('margin-left')
    console.log(leftMargin)
    console.log(element)
  }))
})

我得到一个不错的0px.还检查记录的元素[0] .offsetLeft得到0.

我怎么能(如果可能的话)告诉Karma(Jasmine?)渲染div以便我可以检查偏移?

基于daveoncode建议,我对测试进行了一些更改,我们正在改进.
但是,该指令似乎在测试中不起作用.
我仍然得到0px作为margin-left而265px的offsetLeft

it('should have the same right and left margin',inject(function ($compile) {
  element = angular.element(
      '  <div style="width:50%; margin: 0 auto;">' +
      '    <full-width></full-width>' +
      '  </div>'
  );
  element = $compile(element)(scope)
  angular.element(document).find('body').append(element);

  var el2 = element.find('div')

  var leftMargin = el2.css('margin-left')
  var rightMargin = el2.css('margin-right')
  console.log(leftMargin,el2)
}

解决方法

提示1:

CSS样式在添加到DOM之前不会应用于元素!这不是与业力,角度,茉莉或其他相关的问题……这就是浏览器引擎的工作原理!浏览器解析CSS定义并根据它呈现页面中的元素,但在角度测试中,您编写:

var element = angular.element('<my-directive></my-directive>');
$compile(element)(scope);

您正在处理内存中的DOM节点,除了您的JavaScript代码之外,它们都是未知的!浏览器引擎应该如何将CSS应用于生活在js变量中的内存节点?它显然不能……它只能遍历页面中的节点树,所以……“修复”非常简单:你必须将元素添加到DOM:

angular.element(document).find('body').append(element);

提示2:

好吧,我认为现在你的问题实际上是另一个,你正在使用jQlite .css()实现,这与jQuery不同,它不会检索计算的样式而只是内联的(因此我担心不能“将“自动转换为实际的像素数!”…尝试使用此片段检索剩余的计算边距:

window.getComputedStyle(element,null).marginLeft

(getComputedStyle应该适用于IE以外的每个浏览器,所以如果你使用PhantomJS进行测试就可以了)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读