Как написать модульные тесты репозитория для базы данных Cosmos (SQLApi + CosmosClient) - PullRequest
0 голосов
/ 02 марта 2020

У меня есть класс как показано ниже:

 public class CosmosRepository: ICosmosRepository
 {
        private ICosmoDBSettings cosmoDbSettings;

        private CosmosClient cosmosClient;

        private static readonly object syncLock = new object();

        // The database we will create
        private Database database;

        public CosmosRepository(ICosmoDBSettings cosmoDBSettings)
        {
            this.cosmoDbSettings = cosmoDBSettings;

            this.InitializeComponents();
        }

        private void InitializeComponents()
        {
            try
            {
                if (cosmosClient != null)
                {
                    return;
                }

                lock (syncLock)
                {
                    if (cosmosClient != null)
                    {
                        return;
                    }

                    this.cosmosClient = new CosmosClient(
                        cosmoDbSettings.CosmosDbUri
                        , cosmoDbSettings.CosmosDbAuthKey
                        , new CosmosClientOptions
                            {
                                ConnectionMode = ConnectionMode.Direct
                            }
                        );
                    this.database = this.cosmosClient.CreateDatabaseIfNotExistsAsync(cosmoDbSettings.DocumentDbDataBaseName).Result;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }

У меня есть мой метод хранилища как:
Не беспокойтесь о жестко закодированных значениях.

  public async Task<Employee> GetById()
    {
       var container = this.database.GetContainer("Employees");
       var document = await container.ReadItemAsync<Employee>("44A85B9E-2522-4BDB-891A- 
                      9EA91F6D4CBF", new PartitionKey("PartitionKeyValue"));
       return document.Response;
    }

Примечание
Как написать модульный тест (модульные тесты MS) в. NET Ядро относительно базы данных Cosmos?
Как смоделировать CosmosClient и все его методы. Может ли кто-нибудь помочь мне с этим вопросом?

Мои юнит-тесты выглядят следующим образом:

public class UnitTest1
    {
        private Mock<ICosmoDBSettings> cosmoDbSettings;

        private Mock<CosmosClient> cosmosClient;

        private Mock<Database> database;

        [TestMethod]
        public async Task TestMethod()
        {
            this.CreateSubject();
            var databaseResponse = new Mock<DatabaseResponse>();
            var helper = new CosmosDBHelper(this.cosmoDbSettings.Object);
            this.cosmosClient.Setup(d => d.CreateDatabaseIfNotExistsAsync("TestDatabase", It.IsAny<int>(), It.IsAny<RequestOptions>(), It.IsAny<CancellationToken>())).ReturnsAsync(databaseResponse.Object);
            var mockContainer = new Mock<Container>();
            this.database.Setup(x => x.GetContainer(It.IsAny<string>())).Returns(mockContainer.Object);
            var mockItemResponse = new Mock<ItemResponse<PortalAccount>>();
            mockItemResponse.Setup(x => x.StatusCode).Returns(It.IsAny<HttpStatusCode>);
            var mockPortalAccount = new PortalAccount { PortalAccountGuid = Guid.NewGuid() };
            mockItemResponse.Setup(x => x.Resource).Returns(mockPortalAccount);
            mockContainer.Setup(c => c.ReadItemAsync<PortalAccount>(It.IsAny<string>(),It.IsAny<PartitionKey>(), It.IsAny<ItemRequestOptions>(), It.IsAny<CancellationToken>())).ReturnsAsync(mockItemResponse.Object);

            var pas = helper.GetById().Result;

            Assert.AreEqual(pas.PortalAccountGuid, mockPortalAccount.PortalAccountGuid);


        }
        public void CreateSubject(ICosmoDBSettings cosmoDBSettings = null)
        {
            this.cosmoDbSettings = cosmoDbSettings ?? new Mock<ICosmoDBSettings>();
            this.cosmoDbSettings.Setup(x => x.CosmosDbUri).Returns("https://localhost:8085/");
            this.cosmoDbSettings.Setup(x => x.CosmosDbAuthKey).Returns("C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==");
            this.cosmoDbSettings.Setup(x => x.DocumentDbDataBaseName).Returns("TestDatabase");
            this.database = new Mock<Database>();
            this.cosmosClient = new Mock<CosmosClient>();
        }
    }

Примечание: Исключение: код состояния ответа не указывает на успех: 404 Подстатус: 0 Причина: (Microsoft. Azure .Documents.DocumentClientException: Сообщение: {"Ошибки": ["Ресурс не найден"]}

Я не создаю документ. Я непосредственно загружаю документ, потому что возвращаю только ложный ответ . Это правильно ??

...