0

実際にTDDなどを勉強していて、例で学んでいます。

実際、スタブとモックを使用して、実際の単体テストを紹介するために、小さな (非常に小さな) ORM を構築しています。

私はこのように実行し、テストを実行し、いくつかの小さな実装 (getAll メソッド) を作成しました (失敗 -> テストをパスさせる -> リファクタリング)

実際、ここに私のコードがあります:

MongodbAdapter

export default class MongoAdapter{
  getAll(){
    return new Promise((resolve, reject)=>{
      resolve(['a','b','c','d']);
    });
  }
}

MysqlAdapter

export default class MysqlAdapter{

  getAll(){
    return new Promise((resolve, reject)=>{
      resolve(['a','b','c','d','e']);
    });
  }
}

FactoryAdapter クラス

import MysqlAdapter from './adapters/MysqlAdapter';
import MongoAdapter from './adapters/MongoAdapter';

export default class FactoryAdapter{

  static get(name){
    if(name.toLowerCase() === 'mysql') return new MysqlAdapter();
    if(name.toLowerCase() === 'mongodb') return new MongoAdapter();
    return null;
  }

}

関連する単体テスト:

TestMongoAdapter

import FactoryAdapter from '../../app/FactoryAdapter';

let chai = require('chai');
let sinon = require("sinon");
let expect = chai.expect;

/** @test {MongoAdapter} */
describe('MongoAdapter class',function(){

  /** @test {MongoAdapter#getAll} */
  describe('MongoAdapter#getAll',function(){
    it('Expect getAll() to equals [a,b,c,d]',function(done){
      let adapter = FactoryAdapter.get('mongodb');
      adapter.getAll().then((value)=>{
        expect(value).to.deep.equal(['a','b','c','d']);
        done();
      });
    });
  });
});

他の2つについても同様です。この場合、私の質問は構文の方法ではありません。

質問

実際には、関係するアダプター内で MYSQL および MONGODB の DB ドライバーを使用したいと考えています。実際、私はどのような実装を行うべきかを知っています: FactoryAdapter.get でアダプターのインスタンスを作成するときに、アダプターのコンストラクター メソッド内でドライバーを渡します。

私の問題は、その時点から、コードを実装する前に、どのテストを作成する必要があるか (失敗する必要があるか) がわからないことです。

4

1 に答える 1

1

実際、あなたは実際にかなり使っています。:D

データベース アダプタ テストは、単体テストではなく統合テストです。データベースから切り離してテストすることはできません...すべてのテストは同じ構造を持ち(phpunitマニュアルによる)、フィクスチャがあり、フィクスチャでテストを実行してアサーションを作成します。テストを失敗させたい場合は、何が失敗したかを表明する必要があります。たとえば、データを含む db フィクスチャがあり、コードはそのデータを取得する必要があります。コードがデータベースから取得するデータを必要とするアサーションを記述します。失敗します。その後、コードで作業できます。それはすべてdbテストによるものです。

クラスが db アダプターを使用する場合、アダプターをモックアウトする必要があります。偽のクラスを作成し、完全に制御します。その後、実際のアダプターの代わりにモック アダプターを挿入し、クラスが呼び出すメソッドをテストできます。フィクスチャをモック アダプターに挿入できます。たとえば、データベースにアクセスしてデータのクエリを送信する代わりに、getAll がデータを含む Promise を返すように設定します。

シノンを使っているようです。モックに関するドキュメントは次のとおりですhttp://sinonjs.org/docs/#mocks-api

于 2015-10-16T18:01:08.813 に答える