sql >> データベース >  >> NoSQL >> MongoDB

IFindFluentインターフェースをモックする方法

    このhttps://gist.github.com/mizrael/a061331ff5849bf03bf2 からインスピレーションを得ました。 そして私のために働いた拡張された実装。 IFindFluentインターフェイスの偽の実装を作成しましたが、IAsyncCursorインターフェイスに依存していたので、それも偽の実装を行い、設定したいモックメソッドの代わりにそれを使用しました。その偽の実装では、列挙可能なものを初期化し、使用しているメソッドでそれを返しました。あなたはまだもっと創造的で、あなたが返したいものは何でも遊ぶことができます。これまでのところ、これは私にとってはうまくいきました。

    これが偽の実装です。

    public class FakeFindFluent<TEntity, TProjection> : IFindFluent<TEntity, TEntity>
    {
        private readonly IEnumerable<TEntity> _items;
    
        public FakeFindFluent(IEnumerable<TEntity> items)
        {
            _items = items ?? Enumerable.Empty<TEntity>();
        }
    
        public FilterDefinition<TEntity> Filter { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
    
        public FindOptions<TEntity, TEntity> Options => throw new NotImplementedException();
    
        public IFindFluent<TEntity, TResult> As<TResult>(MongoDB.Bson.Serialization.IBsonSerializer<TResult> resultSerializer = null)
        {
            throw new NotImplementedException();
        }
    
        public long Count(CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }
    
        public Task<long> CountAsync(CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }
    
        public long CountDocuments(CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }
    
        public Task<long> CountDocumentsAsync(CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }
    
        public IFindFluent<TEntity, TEntity> Limit(int? limit)
        {
            throw new NotImplementedException();
        }
    
        public IFindFluent<TEntity, TNewProjection> Project<TNewProjection>(ProjectionDefinition<TEntity, TNewProjection> projection)
        {
            throw new NotImplementedException();
        }
    
        public IFindFluent<TEntity, TEntity> Skip(int? skip)
        {
            throw new NotImplementedException();
        }
    
        public IFindFluent<TEntity, TEntity> Sort(SortDefinition<TEntity> sort)
        {
            throw new NotImplementedException();
        }
    
        public IAsyncCursor<TEntity> ToCursor(CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }
    
        public Task<IAsyncCursor<TEntity>> ToCursorAsync(CancellationToken cancellationToken = default)
        {
            IAsyncCursor<TEntity> cursor = new FakeAsyncCursor<TEntity>(_items);
            var task = Task.FromResult(cursor);
    
            return task;
        }
    }
    
    
    public class FakeAsyncCursor<TEntity> : IAsyncCursor<TEntity>
    {
        private IEnumerable<TEntity> items;
    
        public FakeAsyncCursor(IEnumerable<TEntity> items)
        {
            this.items = items;
        }
    
        public IEnumerable<TEntity> Current => items;
    
        public void Dispose()
        {
            //throw new NotImplementedException();
        }
    
        public bool MoveNext(CancellationToken cancellationToken = default)
        {
            throw new NotImplementedException();
        }
    
        public Task<bool> MoveNextAsync(CancellationToken cancellationToken = default)
        {
            return Task.FromResult(false);
        }
    }
    

    ユニットテストに必要なものを返すようにモックメソッドを設定する方法は次のとおりです。

    mockParticipantRepository
                    .Setup(x => x.FindByFilter(It.IsAny<FilterDefinition<Participant>>()))
                    .Returns(new FakeFindFluent<Participant, Participant>(participantsByRelation));
    

    これがお役に立てば幸いです。




    1. 認証メカニズムSCRAM-SHA-1はサポートされていません

    2. MongoDBからデータを返す方法

    3. Mongo DB:ネストされた配列値を検索

    4. MongoDB:100のコレクションから10のランダムなドキュメントを見つける方法は?