Как я могу Mock MongoDb IMongoCollection в c# модульных тестах? - PullRequest
0 голосов
/ 07 февраля 2020

очень новый для всего этого. Я хочу смоделировать вызовы mongoDb для модульного тестирования моих методов, таких как метод GetLatestBuildDataRecord() ниже:

public class BuildData : BaseData, IBuildData
    {
        private static IMongoCollection<BuildReleaseDefinition> _collection;

        public BuildData(IDatabaseFactory databaseFactory, ProjectConfiguration projectConfiguration)
            : base(projectConfiguration)
        {
            _collection = databaseFactory.GetCollection<BuildReleaseDefinition>(_buildDbName, _buildDbCollectionName) as IMongoCollection<BuildReleaseDefinition>;
        }

        public BuildReleaseDefinition GetLatestBuildDataRecord()
        {
            return _collection.AsQueryable().OrderByDescending(x => x.CreatedOn).FirstOrDefault();
        }

Мое мышление: мне нужно смоделировать коллекцию IMongoCollection, возвращенную из GetCollection _collection = databaseFactory.GetCollection<BuildReleaseDefinition>(_buildDbName, _buildDbCollectionName) as IMongoCollection<BuildReleaseDefinition>;

Но это интерфейс, и я хочу, чтобы он возвращал конкретный класс коллекции объектов в качестве моих тестовых данных. Поэтому я изменил GetCollection, чтобы он возвращал IEnumerable:

public class DatabaseFactory : IDatabaseFactory
    {
        private readonly MongoClient _mongoClient;

        public DatabaseFactory(MongoClient mongoClient)
        {
            _mongoClient = mongoClient;
        }

        public IMongoDatabase GetDatabase(string databaseName)
        {
            return _mongoClient.GetDatabase(databaseName);
        }

        public IEnumerable<T> GetCollection<T>(string databaseName, string collectionName)
        {
            return GetDatabase(databaseName).GetCollection<T>(collectionName) as IEnumerable<T>;
        }
    }

... и тогда я могу создать List<BuildReleaseDefinitions> для использования в качестве моих тестовых данных:

[Fact]
        public void GetLatestBuildDataRecord_GetRecordSuccess_ReturnsSingleLatestRecord()
        {
            // Arrange
            IEnumerable<BuildReleaseDefinition> definitions = new List<BuildReleaseDefinition>
            {
                new BuildReleaseDefinition { Name = "Build1", BuildDefinitionId = 1, CreatedOn = DateTime.Now.AddHours(-1) },
                new BuildReleaseDefinition { Name = "Build2", BuildDefinitionId = 2, CreatedOn = DateTime.Now }
            };

            var expected = new BuildReleaseDefinition { Name = "Build2", BuildDefinitionId = 2, CreatedOn = DateTime.Now };

            var fakeDatabaseFactory = new Mock<IDatabaseFactory>();

            fakeDatabaseFactory
                .Setup(m => m.GetCollection<BuildReleaseDefinition>(It.IsAny<string>(), It.IsAny<string>()))
                .Returns(definitions);

            var buildData = new BuildData(fakeDatabaseFactory.Object, new ProjectConfiguration { BuildDbName = "Jim", BuildDbCollectionName = "Bob" });

            // Act
            var result = buildData.GetLatestBuildDataRecord();

            // Assert
            result.Should().Equals(expected);
        }

Но когда я запускаю test _collection = databaseFactory.GetCollection<BuildReleaseDefinition>(_buildDbName, _buildDbCollectionName) as IMongoCollection<BuildReleaseDefinition>; возвращает ноль.

...