0

MSTest を使用してユニット テスト フレームワークを作成しているため、現在の AIF フレームワーク統合プロジェクトをテストできます。

モックを使用する方法を理解できなかったため、これに対する解決策は、単体テストの開始時にデータベースのスナップショットを取得し、最後にアセンブリの初期化とクリーンアップを使用して復元および破棄することでした。

次に、テスト構造は AX へのログオン呼び出しを行い、必要なデータを作成してから、ログオフして破棄します。次に、必要なデータを整理し、AIF サービスにプッシュします。

スナップショットを復元するまでに、スナップショットは失敗し、他のユーザーがデータベースを使用している間はデータベースを復元できないと表示されます。(使用後にサービスをクリーンアップしていますが)。これを解決するには、その前に別の SQL クエリを実行し、すべてのセッションをループして (現在のセッションを除いて) それらを強制終了します。これにより、DB を正しく復元できますが、セッションを適切に閉じていないため、AX サービスは問題があると判断し、サービスをオフにします。これは、ご想像のとおりあまり役に立ちません。

したがって、ここにはキャッチ 22 の状況があります。

役に立たないと思うので、ここにはコードを含めていませんが、そう思われる場合はお知らせください。

私を助けてください、私は文字通りテザーの終わりにいます!

4

1 に答える 1

0

テストと本番データベースは常に分離する必要があります。テストに本番データベースを使用することはお勧めできません。そして、それにはいくつかの理由があります。

  1. OptimisticConcurrencyException – テスト シナリオ中にエンティティ オブジェクトの操作を開始した場合、シナリオの最後に操作するエンティティが他のクライアントによって変更されないことを確認できません。それが起こった場合、テストを赤く不安定にする例外が発生します。
  2. 各関数呼び出しを制御することはできません。スタブとモックを使用する場合、提供するデータを使用していくつかの小さなロジックをチェックする必要があります。このデータがテスト シナリオ中に変更される可能性がある場合、テスト結果について確信が持てません。
  3. 本番データベースで変更したすべてのデータを消去するのを忘れた場合は、データベースにテスト データを入力します。

したがって、これらの問題の解決策は異なる場合があります。

  • ビルドサーバーで別のデータベースを使用するだけです(テスト用のみ)。そして、それを[TestInitialize]メソッドに入力します( でクリーンアップすることを忘れないでください[TestCleanup])。
  • テスト用にインメモリデータベースをセットアップできます.netのインメモリデータベース
  • リポジトリのモックを試すことができます (DAO でどの構造を使用しているかわかりません)。ただし、単純な IRepository の場合は、それが提供するインターフェイスをモックして、簡単にテストできます。例えば

    interface IRepository<T> where T : Entity
    {
     IQueryable<T> GetAll();
    
     bool Save(T entity);
    
     bool Delete(int id);
    
     bool Delete(T entity);
     }
    

次のようにスタブできます。

 [TestClass]
    public class UnitTest1
    {
        private IRepository<Entity> _repository;
        private SomeService _target;

        [TestInitialize]
        public void SetUp()
        {
            _repository = MockRepository.GenerateStub<IRepository<Entity>>();
            _target = new SomeService(_repository);
        }


        [TestMethod]
        public void TestMethod1()
        {
            _repository.Stub(x => x.GetAll()).Return(new List<Entity>().AsQueryable());

            //Test your target
        }
    }
于 2014-11-05T16:48:49.807 に答える