очень новый для всего этого. Я хочу смоделировать вызовы 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>;
возвращает ноль.