7

私の最初の ember.js アプリをテストしようとしています。ember アプリ キットを使用します。

qunit がセレクターでどのように機能するかに困惑しています (jquery セレクターが機能すると想定していましたが、ほとんどの場合、機能します...)。

私のハンドルバーには次のコードがあります:

{{#link-to 'locations.new' classNames='add-btn'}}
  Add new location
{{/link-to}}

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');
});

注: EAK のこの PRのヘルパーを使用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 )

そして、テストはパスします。

質問:

  1. href で見つかった同じ変数で "click()" を呼び出すことができないのはなぜですか?
  2. 実装に対して合理的に無関心でテストしていますか? (まあ、クラスごとに要素を見つけるという回避策は、その法案に適合しませんか?)

前もって感謝します!

アップデート

kingpin2kのコメントによると、選択したアサーション メソッドが間違っていたため、テストに合格していました。空の配列のok(foo, 'bar')場合は合格します (結果がない場合に返されます)。Ember API ドキュメントでは、 findWithAssertを使用するように案内されましたが、などとリンクしております。foofindhref

厄介なことに、 JS コンソールでjQuery ドキュメント[attribute='value']ごとに jquery セレクターを使用すると機能します。そして、ember-testing でのfindfindWithAssertの実装は、セレクターを jQuery に渡すだけのようです...

なぜ失敗するのですか?知らない。GLaDOSが説明したように、スピーディーなものが入り、スピーディーなものが出てくると考える人もいるでしょう-セレクターをjQueryに渡すだけで、jQueryが返すように返されますが、明らかにそうではありません.

その場合は、クラス セレクターの使用に固執しますが、それは実装に影響を与えます。

4

1 に答える 1

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'));
  }

そして驚いたことに、先頭の#.

回答:href ember.js ヘルパーで属性を 持つ複雑な css セレクターを使用する場合find()は、URL からハッシュを削除します。

于 2014-02-05T03:10:40.063 に答える