2

統合テストでカバーしようとしているkoaで構築されたJSON APIがあります。

簡単なテストは次のようになります。

      describe("GET: /users", function() {
        it ("should respond", function (done) {
          request(server)
          .get('/api/users')
          .expect(200, done);
        });
      });

ここで問題が発生するのは、コントローラーの背後にあるアクション (POST /users での saveUser など) が外部リソースを使用する場合です。たとえば、ユーザーの電話番号を検証する必要があります。

私のコントローラーは次のようになります。

  save: async function(ctx, next) {
    const userFromRequest = await parse(ctx);
    try {
      // validate data
      await ctx.repo.validate(userFromRequest);

      // validate mobile code
      await ctx.repo.validateSMSCode(
        userFromRequest.mobile_number_verification_token,
        userFromRequest.mobile_number.prefix +  userFromRequest.mobile_number.number
      );

      const user = await ctx.repo.create(userFromRequest);

      return ctx.data(201, { user });
    } catch (e) {
      return ctx.error(422, e.message, e.meta);
    }
  }

リクエストオブジェクトをモックできることを望んでいましctx.repoたが、テストからそれを取得できないようです。つまり、テストが実際に電話番号検証サービスにヒットしていることを意味します。

その検証サービスにアクセスする方法はありますか?

4

2 に答える 2

-1

app.contextが作成されるプロトタイプctxです。ctxを編集して、プロパティを追加することができますapp.contextctxこれは、全体で使用されるプロパティまたはメソッドを追加するのに役立ちます。これは、アンチパターンと見なされる可能性のあるへの依存度を犠牲にして、appよりパフォーマンスが高く (ミドルウェアがない) および/またはより簡単 (より少ない) になる可能性があります。require()ctx

app.context.someProp = "Some Value";

app.use(async (ctx) => {
  console.log(ctx.someProp);
});

app.context.repo.validateSMSCodeサンプルでは、​​テストに次のセットアップ行があると仮定して、次のように再定義します。

import app from '../app'
import supertest from 'supertest'

app.context.repo.validateSMSCode = async function(ctx, next) {
  // Your logic here.
};    

const request = supertest.agent(app.listen())

テストで定義するメソッドを再定義app.context.repo.validateSMSCodeすると、元のメソッドの代わりに機能します。

于 2016-06-30T11:34:13.950 に答える