尝试试用我的第一个ember.js应用。使用ember app kit。
qunit如何与选择器一起使用感到困惑(我假设jquery选择器可以工作,而且它们确实有用 - 大部分......)。
我的车把有这个代码:
{{#link-to 'locations.new' classNames='add-btn'}}
Add new location
{{/link-to}}
我打算测试是否存在具有相应href
的链接,并点击该链接并在点击后验证当前网址和路由。
所以,我的测试如下:
// 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');
});
注意:我正在使用this PR on EAK中的currentRouteName
和currentURL
个助手,他们确实按预期工作。
我的测试在click(link)
部分失败,Error: Element [object Object] not found.
。
如果我尝试直接将选择器传递给点击 - 就像这样 - 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 )
测试通过。
问题:
提前致谢!
更新
根据kingpin2k的评论,由于我选择了错误的断言方法,我的测试正在通过 - 如果ok(foo, 'bar')
是一个空数组foo
,find
将会通过如果没有结果,则返回.Ember API文档指导我使用findWithAssert,但无法找到与此href
的链接。
令人困惑的是,在JS控制台的每个jQuery docs中使用[attribute='value']
jquery选择器工作;在ember-testing中find以及findWithAssert的实现似乎只是将选择器传递给jQuery ......
为什么会失败?我不知道。有人会认为GLaDOS解释speedy thing goes in, speedy thing comes out - 只是将选择器传递给jQuery会将其返回给jQuery将其返回 - 但显然不是。
我会坚持使用类选择器,尽管它确实有点决定实现。
答案 0 :(得分:4)
拒绝放弃使测试实现无关,我决定使用基本选择器,并发现了我失败的无证件的罪魁祸首。
首先,我想获取所有链接 - 并按href
属性过滤它们:
var links = findWithAssert('a');
var my-link = links.filter('[href="#/location/new"]');
这给了我正确的links
长度,但my-link
仍然是空的。所以我提醒了所有hrefs,以确保我没有遗漏任何东西:
for(var i=0; i<links.length; i++){
alert(links[i].getAttribute('href'));
}
令我惊讶的是,我看到hrefs在没有前导#
的情况下发出警告。
<强>答案:强>
在ember.js href
帮助器中使用具有find()
属性的复杂css选择器时,请从URL中删除哈希值。