0

Ember CLI Mirageを使用した Ember CLI (1.13.1) 受け入れテスト用にモック サーバーをセットアップしようとしています。セットアップをデバッグし、ビューで利用可能なモデル データを実際にテストする方法に行き詰まっています。

Mirage ルート内にコンソール ログ ステートメントを追加してみました。

this.get('/users', function(db){
  console.log(db.users);
  return db.users;
});

これは、mirage ルートが呼び出され、3 人のユーザーが存在する必要があることを示しています。しかし、私のテストはまだ失敗しています。受け入れテストまたはテンプレートでストアにあるものを確認するにはどうすればよいですか?

テスト/受け入れ/ユーザー/index-test.js

/* jshint expr:true */
import {
  describe,
  it,
  beforeEach,
  afterEach
} from 'mocha';
import { expect } from 'chai';
import Ember from 'ember';
import startApp from 'tagged/tests/helpers/start-app';

describe('Acceptance: UsersIndex', function() {
  var application;
  var users;

  beforeEach(function() {
    application = startApp();
    users = server.createList('user', 3);
  });

  afterEach(function() {
    Ember.run(application, 'destroy');
  });

  it('can visit /users/index', function() {
    visit('/users');
    andThen(function() {
      expect(currentPath()).to.equal('users.index');
    });
  });

  it('lists the users', function(){
    visit('/users');
    andThen(function() {
      users = server.createList('user', 3);
      expect(find('.user').length).to.equal(3); // fails
    });
  });
});

AssertionError: 期待される 0 は 3 に等しい

アプリ/ミラージュ/config.js

export default function() {
  /*
    Config (with defaults).

    Note: these only affect routes defined *after* them!
  */
  this.namespace = '/api/v1';    // make this `api`, for example, if your API is namespaced
  // this.timing = 400;      // delay for each request, automatically set to 0 during testing

  this.get('/users');
}


// You can optionally export a config that is only loaded during tests
export function testConfig() {
  this.timing = 1;
}

アプリ/ミラージュ/工場/user.js

import Mirage, {faker} from 'ember-cli-mirage';
export default Mirage.Factory.extend({
  email: function(){ return faker.internet.email(); }
});

アプリ/ルート/ユーザー/index.js

import Ember from 'ember';

export default Ember.Route.extend({
  model: function(){
    return this.store.findAll('user');
  }
});

アプリ/テンプレート/ユーザー/index.hbs

<h2>Users</h2>

<table>
  <thead>
    <tr>
      <th>Actions</th>
      <th>Email</th>
    </tr>
  </thead>
  <tbody>

  {{#each model as |user|}}
    <tr class="user">
      <td class="actions"><a href="#">Show</a></td>
      <td class="email">{{ user.email }}</td>
    </tr>
  {{/each}}
  </tbody>
</table>
4

1 に答える 1

3

私は通常、Ember Inspector の [データ] タブを調べて、モデルがストアに追加されているかどうかを確認することから始めます。

1.13 を使用している場合は、JSON API アダプターを使用している可能性が高く、タイプを持つデータ キーでオブジェクトを返すなど、mirage ルート ハンドラーでもう少し作業を行う必要があります。

たとえば、次のようになります。

this.get('/users', function(db){
  return {
    data: db.users.map(u => ({
      id: u.id,
      type: u.type,
      attributes: _.omit(u, ['id', 'type'])
     }))
  };
});

ファクトリは Mirage のデータベースをシードするためだけのものであることに注意してください。したがって、上記のルートを使用すると、質問で定義したようなファクトリを使用できるようになります

// mirage/scenarios/default.js
export default function(server) {
  server.createList('user', 10);
});

その後、アプリを起動して に GET リクエストを送信する/usersと、データが返され、Ember Data によって適切に逆シリアル化されます。

于 2015-08-03T11:49:24.877 に答える