web-dev-qa-db-ja.com

mochaとsinonを使用してノードでhttpリクエストをモックする

外部APIへの呼び出しをプロキシするexpressを使用してNodeJSアプリを作成しました。だから私はモカとシノンを使ってユニットテストを書こうとしています。私の目標は、インターネットに接続せずにアプリをテストすることです。そのため、httpsリクエストをモックして、モック応答を返そうとしています。

自分のケースに合った例やチュートリアルが見つからないという問題があります。私のノードアプリはポート8081でhttpリクエストをリッスンし、それらを別のサイトにプロキシします。これらの外部サーバーに実際にリクエストを送信せずに、アプリをテストしたいと思います。以下で試してみて、送り返したいjson応答をserver.respondsWith()関数に入れました。

私はチャイでajax呼び出しを行うことによってこれを正しい方法で行っていますか?または、何らかの方法でアプリ内でリクエストを送信する必要があります。どんな助けでも大歓迎です。

var assert = require('assert');
var chai = require('chai');
var spies = require('chai-spies');
var chaiHttp = require('chai-http');
var https = require('https');
var should = chai.should();
var expect = chai.expect;
var sinon = require('sinon');

chai.use(spies);
chai.use(chaiHttp);

describe('Car Repository', function() {
  var server;
  before(function() {
    server = sinon.fakeServer.create();
  });

  after(function() {
    server.restore();
  });

  var url = 'http://127.0.0.1:8081';
  it('should succeed and return a list of cars', function(done) {
    server.respondWith('POST', 'https://api.sandbox.cars.com/v2/token_endpoint', JSON.stringify({"access_token":"1t3E4IykfpJAbuFsdfM2oFAo5raB5vhfOV0hAYe","token_type":"bearer","expires_in":604800}));
    server.respondWith('GET', url+'/cars', JSON.stringify({'test':'this works'}));

    chai.request(url)
      .get('/cars')
      .end(function(err, res) {
        if (err) {
          throw err;
        }

        res.should.have.status(200);
        res.body.should.have.property('test');
        console.log(res.body);

        done();
      });
    });
});
7
george_h

Nock ライブラリをチェックしてください。それはまさにあなたが探していることをします。

Nockは、Node.js用のHTTPモックおよび期待値ライブラリです。

Nockは、HTTPリクエストを分離して実行するモジュールをテストするために使用できます。

たとえば、モジュールがCouchDBサーバーに対してHTTPリクエストを実行したり、Amazon APIに対してHTTPリクエストを行ったりする場合、そのモジュールを個別にテストできます。

14
KJ3

ここでの新しい解決策は、sinonの偽のサーバーです。

http://sinonjs.org/releases/v2.1.0/fake-xhr-and-server/#fake-server

1
danday74

node-tdduseNockフラグを見てください。モカとノック(受け入れられた回答に記載されています)の上に構築され、各テストの記録ファイルを自動的に作成して使用します。

とても使いやすいのが大好きです。基本的には「有効にして忘れる」だけで、リクエスト/テストケースの作成に集中します。テストの変更を要求した場合でも、記録ファイルを削除または調整する必要がありますが、少なくともコードとは完全に分離されています。

0
vincent