Server

Mirage サーバー。

テストでserver が参照するインスタンスと同じインスタンスを、routes 関数内のthis は参照することに注意してください。

プロパティ

db: 任意

Mirage Db インスタンスを返します。

inflector: 任意

Mirage は、一部の API が動作するために、特定の単語の単数形と複数形を知る必要があります。

たとえば、モデルを定義するとき

new Server({
  models: {
    post: Model
  }
})

Mirage は "post" という単語を複数形にして、db.posts データベースコレクションを作成するために使用します。

これを実現するために、Mirage は Inflector と呼ばれるオブジェクトを使用します。Inflector は、単語の活用が必要な場合に Mirage が呼び出すsingularizepluralize の2つのメソッドを持つオブジェクトです。

Mirage にはデフォルトの inflector がありますので、

new Server()

Node の inflected パッケージを使用します。不規則な単語がある場合や、デフォルトを変更する必要がある場合は、これをカスタマイズできます。活用のカスタマイズに関するガイドで詳細を読むことができます。

通常は、提供された inflector を使用してカスタマイズを行うことができます。バックエンドで使用しているカスタムインフレクションと一致させることが推奨されます。これにより、Mirage コードの一貫性とシンプルさを維持できます。

inflector を完全にオーバーライドして、独自の pluralizesingularize メソッドを提供することもできます。

new Server({
  inflector: {
    pluralize(word) {
      // your logic
    },
    singularize(word) {
      // your logic
    }
  }
})

logging: 任意

true または false に設定して、ログ出力動作を明示的に指定します。

デフォルトでは、非テスト環境ではサーバーのレスポンスがログ出力されます。テストでは、CI テストランナーの出力が煩雑にならないように、デフォルトでログ出力が無効になっています。

たとえば、テストでログ出力を有効にするには、次のように記述します。

test('I can view all users', function() {
  server.logging = true;
  server.create('user');

  visit('/users');
  // ...
});

Pretender サーバーの handledRequest フック を使用して、カスタムログメッセージを作成することもできます。(server.pretender を介して、Mirage サーバーから Pretender サーバーにアクセスできます。)

上書きするには、

new Server({
  routes() {
    this.pretender.handledRequest = function(verb, path, request) {
      let { responseText } = request;
      // log request and response data
    }
  }
})

namespace: 任意

getpostput、または del で定義されたすべてのルートに使用される基本ネームスペースを設定します。

例えば、

new Server({
  routes() {
    this.namespace = '/api';

    // this route will handle the URL '/api/contacts'
    this.get('/contacts', 'contacts');
  }
})

this.namespace の後に定義されたルートのみが影響を受けます。これは、ネームスペースの下に配置したくないいくつかの単発ルートがある場合に便利です。

new Server({
  routes() {

    // this route handles /auth
    this.get('/auth', function() { ...});

    this.namespace = '/api';
    // this route will handle the URL '/api/contacts'
    this.get('/contacts', 'contacts');
  };
})

アプリケーションがファイルシステムからロードされる場合(例:Cordova または Electron を介して、localhost または https://yourhost.com/ を介するサーバーとは対照的に)、ネームスペースを明示的に定義する必要があります。可能性のある値は/(リクエストが相対パスで作成される場合)または https://yourhost.com/api/...(リクエストが定義されたサーバーに対して作成される場合)です。

構成された API ホストとネームスペースを利用したサンプル実装については、このissueコメントを参照してください。

pretender: 任意

Mirage は、その XHR インターセプターとして pretender.js を使用します。Mirage の設定で、this.pretender は実際の Pretender インスタンスを参照します。そのため、そこで機能する設定オプションはここで使用することもできます。

new Server({
  routes() {
    this.pretender.handledRequest = (verb, path, request) => {
      console.log(`Your server responded to ${path}`);
    }
  }
})

Pretender インスタンスでオプションを変更する場合は、Pretender のドキュメントを参照してください。

schema: 任意

Mirage Schema(ORM)インスタンスを返します。

timing: 任意

サーバーのレスポンスタイムをミリ秒単位で設定します。

デフォルトでは、開発中は 400 ミリ秒の遅延があり、テスト中は 0 ミリ秒の遅延があります(テストが高速に実行されます)。

new Server({
  routes() {
    this.timing = 400; // default
  }
})

個々のルートのタイミングを設定するには、ルートハンドラーの timing オプションを参照してください。

urlPrefix: 任意

すべてのルートハンドラーURLの前に付ける文字列を設定します。

アプリケーションが異なるポートにAPIリクエストを行う場合に便利です。

new Server({
  routes() {
    this.urlPrefix = 'http://localhost:8080'
  }
})

メソッド

create(type: 任意, traitsAndOverrides: 任意): 任意

type タイプの単一モデルを生成し、データベースに挿入して(ID を付与して)、追加されたデータを返します。

test("I can view a contact's details", function() {
  let contact = server.create('contact');

  visit('/contacts/' + contact.id);

  andThen(() => {
    equal( find('h1').text(), 'The contact is Link');
  });
});

ファクトリ定義の属性は、第二引数としてハッシュを渡すことで上書きできます。例えば、このようなファクトリがあった場合

export default Factory.extend({
  name: 'Link'
});

このようにしてnameを上書きできます。

test("I can view the contacts", function() {
  server.create('contact', {name: 'Zelda'});

  visit('/');

  andThen(() => {
    equal( find('p').text(), 'Zelda' );
  });
});

createList(type: 任意, amount: 任意, traitsAndOverrides: 任意): 任意

type のモデルを amount 個作成します。必要に応じて、attrs を使用してファクトリからの属性を上書きします。

データベースに追加されたレコードの配列を返します。

テストからの例を以下に示します。

test("I can view the contacts", function() {
  server.createList('contact', 5);
  let youngContacts = server.createList('contact', 5, {age: 15});

  visit('/');

  andThen(function() {
    equal(currentRouteName(), 'index');
    equal( find('p').length, 10 );
  });
});

開発データベースの設定からの例を以下に示します。

new Server({
  seeds(server) {
    let contact = server.create('contact')

    server.createList('address', 5, { contact })
  }
})

loadFixtures(...args: 文字列): 任意

デフォルトでは、ファクトリが定義されていない場合はテスト中に、seedsが定義されていない場合は開発中に、fixturesが読み込まれます。loadFixtures() を使用すると、ファクトリを使用してデータベースをシードすることに加えて、これらのいずれかの環境でもフィクスチャファイルを読み込むことができます。

server.loadFixtures() はすべてのファイルを読み込み、server.loadFixtures(file1, file2...) は選択したフィクスチャファイルを読み込みます。

例えば、テストでは、すべてのフィクスチャデータを読み込んでから開始する場合があります。

test('I can view the photos', function() {
  server.loadFixtures();
  server.createList('photo', 10);

  visit('/');

  andThen(() => {
    equal( find('img').length, 10 );
  });
});

または、開発では、いくつかの参照フィクスチャファイルを読み込み、ファクトリを使用して残りのデータを作成する場合があります。

new Server({
  ...,
  seeds(server) {
    server.loadFixtures('countries', 'states');

    let author = server.create('author');
    server.createList('post', 10, {author_id: author.id});
  }
})

passthrough(...paths: 文字列, options: 配列): 任意

デフォルトでは、アプリケーションがサーバー設定で定義されていないリクエストを行うと、Mirage はエラーをスローします。passthrough を使用してリクエストをホワイトリストに登録し、Mirage サーバーから実際のネットワーク層にリクエストを渡すことができます。

注:ルートハンドラーに優先順位を与えるために、すべての passthrough 設定をルートの最後に配置してください。

現在のホスト(および設定されたnamespace)上のパスを無視するには、先頭に/ を使用します。

this.passthrough('/addresses');

パスの一覧を渡すことも、passthroughを複数回呼び出すこともできます。

this.passthrough('/addresses', '/contacts');
this.passthrough('/something');
this.passthrough('/else');

これらの行により、すべてのHTTPメソッドが通過します。特定のメソッドのみを通過させる場合は、指定したメソッドを含む配列を最後の引数として渡します。

this.passthrough('/addresses', ['post']);
this.passthrough('/contacts', '/photos', ['get']);

passthrough に関数を渡して、リクエストをMirageで処理するかどうかをランタイムでチェックできます。関数がtrueを返す場合、Mirageはリクエストを処理せず、通過させます。

this.passthrough(request => {
  return request.queryParams.skipMirage;
});

現在のドメインのすべてのリクエストを通過させるには、引数なしでメソッドを呼び出します。

this.passthrough();

現在のネームスペース(つまり、この呼び出しの上に定義されているnamespaceプロパティ)が適用されることに再度注意してください。

他のオリジンのホストも通過させることができます。完全修飾ドメイン名を使用する場合、namespaceプロパティは無視されます。パス下のすべてのリクエストに一致させるには、2つの*ワイルドカードを使用します。

this.passthrough('http://api.foo.bar/**');
this.passthrough('http://api.twitter.com/v1/cards/**');

0.12より前のバージョンのPretenderでは、passthroughはjQuery >= 2.xでのみ動作しました。Pretender@0.12以降を使用している限り、問題ありません。

shutdown(): 任意

サーバーをシャットダウンし、ネットワークリクエストのインターセプトを停止します。