测试一个ember app - ember.js find()帮助程序可接受的选择器

app*_*Dev 7 testing jquery qunit ember.js ember-app-kit

试图试驾我的第一个ember.js应用程序.使用ember app kit.

qunit如何与选择器一起使用感到困惑(我假设jquery选择器可以工作,而且它们确实在 - 大部分......).

我的车把有这个代码:

{{#link-to 'locations.new' classNames='add-btn'}}
  Add new location
{{/link-to}}
Run Code Online (Sandbox Code Playgroud)

我打算测试是否存在适当的链接,href并单击链接并在点击后验证当前的URL和路由.

所以,我的测试如下:

// There is an element that links to locations/new
var link = find('a[href="#/locations/new"]');
ok(link, 'There is a link to add new location on the page');

click(link);
andThen(function() {
  equal(currentRouteName(), 'locations.new', 'Clicked "add" button - now locations.new route is active');
  equal(currentURL(), '/locations/new', 'Clicked "add" button - and current url is /locations/new');
});
Run Code Online (Sandbox Code Playgroud)

注意:我使用currentRouteNamecurrentURL助手从这个PR的EAK,和他们像预期的那样.

我的测试失败click(link)Error: Element [object Object] not found..

如果我尝试直接将选择器传递给click - 就像这样click("a[href='#/locations/new']")- 我收到一个错误Element a[href='#/locations/new'] not found..如果我尝试使用反斜杠或双反斜杠转义特殊字符#,则结果相同.

目前,我通过逐类抓取div来缓解这个问题 - 就像这样:

var link-by-class = find('.add-btn');
click(link-by-class);
andThen( as above )
Run Code Online (Sandbox Code Playgroud)

测试通过了.

问题:

  1. 为什么我不能在href找到的同一个变量上调用"click()"?
  2. 我是否对实施有合理的漠视?(那么,通过课程找到元素的解决方法不符合该法案?)

提前致谢!

UPDATE

根据kingpin2k的评论,我的测试是由于我选择了错误的断言方法ok(foo, 'bar')而传递 - 如果foo是一个空数组将find返回(如果没有结果则返回.Ember API文档引导我使用findWithAssert,它无法找到与此相关联href.

令人迷惑的是,在JS控制台的[attribute='value']每个jQuery文档中使用jquery选择器工作; 并且在ember-testing 中findfindWithAssert的实现似乎只是将选择器传递给jQuery ...

为什么会失败?我不知道.人们会认为GLaDOS解释了快速的事情,快速的事情出来了 - 只是将选择器传递给jQuery会让它回来,因为jQuery会返回它 - 但显然不是.

我会坚持使用类选择器,虽然它确实有点决定实现.

app*_*Dev 4

由于拒绝放弃使测试实现不可知,我决定使用基本选择器,并发现了失败的未记录的罪魁祸首。

首先,我想获取所有链接 - 并按href属性过滤它们:

  var links = findWithAssert('a');
  var my-link = links.filter('[href="#/location/new"]');
Run Code Online (Sandbox Code Playgroud)

这给了我正确的长度links,但my-link仍然是空的。所以我提醒了所有的hrefs,以确保我没有遗漏任何内容:

  for(var i=0; i<links.length; i++){
    alert(links[i].getAttribute('href'));
  }
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,我看到提示的 href 没有前导#.

答案:href当在 ember.js帮助器中 使用具有属性的复杂 css 选择器时find(),请从 url 中删除哈希值。