2

いくつかの失敗に悩まされ、ミラージュを正しく理解しているかどうかを知りたい:

1.ember-cli-mirage で、定義したサーバー応答が実際のサーバーが返すものを反映する必要があるというのは正しいですか? 例えば:

this.get('/athletes', function(db, request) {
  let athletes = db.athletes || [];
  return {
    athletes: athletes,
    meta: { count: athletes.length }
  }
});

私はカスタムシリアライザーを使用しており、上記はこのルートでの get 要求に対するサーバー応答の形式と一致していますが、2 つのテストで次のエラーで 2 つの失敗が発生しています。normalizeResponse must return a valid JSON API document: meta must be an object

2. Mirage は json:api 形式を強制していますか? テストのセットアップ方法が原因でそうなっているのでしょうか?

たとえば、上記の/athletesルートにアクセスするいくつかのテストがありますが、以下のような非同期呼び出しを使用すると失敗が発生します。サーバーの応答動作を正しく上書きする適切な方法と、2 つのテストでコンソールに normalizeResponse エラーが表示されるのに、以下の 1 つだけが失敗する理由を知りたいです。

test('contact params not sent with request after clicking .showglobal', function(assert) {
  assert.expect(2);
  let done = assert.async();
  server.createList('athlete', 10);

  //perform a search, which shows all 10 athletes
  visit('/athletes');
  fillIn('.search-inner input', "c");

  andThen(() => {
    server.get('/athletes', (db, request) => {
      assert.notOk(params.hasOwnProperty("contacts"));
      done();
    });

    //get global athletes, which I thought would now be intercepted by the server.get call defined within the andThen block
    click('button.showglobal');
  });
});

結果:

✘ Error: Assertion Failed: normalizeResponse must return a valid JSON API document:
    * meta must be an object
         expected true

ここの最後の例で提案されているように、サーバーの応答を json:api 形式に変更しようとしましたが、これは実際のサーバーの応答とはまったく異なり、アプリがこの構造のペイロードを解析しないため、テストが失敗します。ヒントやアドバイスをいただければ幸いです。

4

2 に答える 2

4
  1. あなたは正しいです。上に示したモックでエラーが発生していますか? meta常にオブジェクトとして返されるように見えるので、リクエストが行われた後にコンソールを見て、レスポンスが想定どおりであることを確認してください。

    テスト中に応答を確認したい場合は、テストに次のように入力server.logging = trueします。

    test('I can view the photos', function() {
      server.logging = true;
      server.createList('photo', 10);
    
      visit('/');
    
      andThen(function() {
        equal( find('img').length, 10 );
      });
    });
    
  2. いいえ、Mirage は特定のバックエンドにとらわれませんが、いくつかのデフォルトが付属しています。server.loggingここでも、テストをデバッグするためにここを有効にしてみます。

    assertまた、モック サーバーに対して s を記述する場合は、ドキュメントの例に示すように、テストの最初にルート ハンドラーを定義します。

于 2015-12-29T18:35:03.437 に答える
0

サムのアドバイスに基づいて、2 番目のテストに合格することができました。私の混乱は、アクセスしてアクションを実行する必要があるルートのリクエスト パラメータに対してアサートする方法でした。にアクセス/athletesしてさまざまなボタンをクリックする必要がありましたが、これらのアクションごとに個別のリクエスト (およびパラメーター) が /athletes ルートに送信されていました。これが、andThen ブロック内でルート ハンドラーを再定義しようとした理由です (つまり、mirage/config ファイルのルート定義を使用して既にルートにアクセスした後)。

私のソリューションは好きではありませんが、私がそれを処理した方法は、アサーションをルート ハンドラーの外に移動し、代わりにリクエストの値を最上位の変数に割り当てることでした。このようにして、最後の andThen() ブロックで、/athletes ルートへの最後の呼び出しに対してアサートすることができました。

  assert.expect(1);
  //will get assigned the value of 'request' on each server call
  let athletesRequest;

  //override server response defined in mirage/config in order to
  //capture and assert against request/response after user actions
  server.get('athletes', (db, request) => {
    let athletes    = db.athletes || [];
    athletesRequest = request;

    return {
      athletes: athletes,
      meta: { count: athletes.length }
    };
  });

  //sends request to /athletes
  visit('/athletes');
  andThen(() => {
    //sends request to /athletes
    fillIn('.search-inner input', "ab");
    andThen(function() {
      //sends (final) request to /athletes
      click('button.search');
      andThen(function() {
      //asserts against /athletes request made on click('button.search')                   assert.notOk(athletesRequest.queryParams.hasOwnProperty("contact"));
      });
    });
  });

に関連するコンソール エラーが引き続き発生しmeta is not an objectますが、テストのパスを妨げているわけではありません。を使用するserver.logging = trueと、すべての FakeServer 応答で meta が実際にオブジェクトであることを確認できました。

アドバイスをくれたサムに再び感謝します。server.logging = trueまたpauseTest()、受け入れテストのトラブルシューティングがはるかに簡単になります。

于 2015-12-31T15:39:05.663 に答える