Mock Cosmos Db - контекст API Mongo Db для модульного тестирования - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь выполнить модульное тестирование метода Comos DB - MongoDb API FindAll(), высмеивая ContextComsDb.

public class ContextCosmosDb
{
    public virtual IMongoClient Client { get; set; }
    public virtual IMongoDatabase Database { get; set; }
    public ContextCosmosDb(IOptionsCosmosDb options)
    {
        var settings = MongoClientSettings.FromUrl(new 
        MongoUrl(options.MongoApiConnectionString));
        settings.SslSettings =
            new SslSettings { EnabledSslProtocols = SslProtocols.Tls12 };
        Client = new MongoClient(settings);

        Database = (Client != null) ? 
        Client.GetDatabase(options.DatabaseName) : null;
    }
}
public abstract class RepositoryBaseCosmosDb<T> : 
    IRepositoryBaseCosmosDb<T> where T : EntityBaseCosmosDb
{
    public RepositoryBaseCosmosDb(ContextCosmosDb cosmosDbContext)
    {
        RepositoryContext = cosmosDbContext;
    }
    public IQueryable<T> FindAll()
    {
        return RepositoryContext.Database.GetCollection<T> 
            (CollectionName).AsQueryable();
    }
}

Ниже приведено то, что я написал для проверки.

public class RepositoryBaseCosmosDbTest
{
    [Trait("Category", "FindAll")]
    [Fact]
    public void FindAll_ShouldReturnAllData()
    {
        // Arrange
        var mongoDatabase = new Mock<IMongoDatabase>();
        var collection = new Mock<IMongoCollection<CosmosDbBlog>>();
        var context = new Mock<ContextCosmosDb>
            (new OptionsCosmosDb<ContextCosmosDb> ("mongodb://localhost", "test"));
        collection.Object.InsertOne(new CosmosDbBlog { BlogId = 1, Name = "BBB" });
        collection.Object.InsertOne(new CosmosDbBlog { BlogId = 2, Name = "ZZZ" });
        collection.Object.InsertOne(new CosmosDbBlog { BlogId = 3, Name = "AAA" });
        context.Setup(x => x.Database.GetCollection<CosmosDbBlog> 
            ("CosmosDbBlogList", null)).Returns(collection.Object);
        var service = new BlogRepositoryCosmosDb<CosmosDbBlog>(context.Object);

        // Act
        var blogs = service.FindAll();

        // Assert
        Assert.True(blogs.Select(b => b.Name == "BBB").Any());
        Assert.True(blogs.Select(b => b.Name == "ZZZ").Any());
        Assert.True(blogs.Select(b => b.Name == "AAA").Any());
    }
}

Я получаю

System.NullReferenceException: 'Ссылка на объект не установлена ​​для экземпляра объекта'

пока я делаю Assert. Пожалуйста, помоги, если можешь!

1 Ответ

0 голосов
/ 08 июля 2019

Ниже сработал код,

    [Trait("Category", "FindAll")]
    [Fact]
    public void FindAll_ShouldReturnAllData()
    {
        // Arrange
        var mongoDatabase = new Mock<IMongoDatabase>();
        var collection = new Mock<IMongoCollection<CosmosDbBlog>>();
        var context = new Mock<ContextCosmosDb>(new OptionsCosmosDb<ContextCosmosDb>("mongodb://localhost", "test"));
        context.Setup(x => x.Database.GetCollection<CosmosDbBlog>(It.IsAny<string>(), null))
            .Returns(collection.Object).Verifiable();

        // Act
        var service = new BlogRepositoryCosmosDb<CosmosDbBlog>(context.Object);
        var blogs = service.FindAll();

        // Assert
        context.Verify();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...