Как я могу реализовать макеты для этого модульного теста? - PullRequest
0 голосов
/ 20 декабря 2018

Мне нужно написать модульный тест для следующего метода:

private async Task<bool> CreateFileAsync(string fileContent, string containerName, string fileName, string connectionString)
{
  CloudStorageAccount cloudStorageAccount = await GetCloudStorageAccount(connectionString);
  CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient();
  CloudBlobContainer containerRef = blobClient.GetContainerReference(containerName);
  CloudBlockBlob blobRef = containerRef.GetBlockBlobReference(fileName);
  await blobRef.UploadTextAsync(fileContent);

  return true;
}

Мне нужно написать модульный тест xUnit, который выдаст HttpException при вызове blobRef.UploadTextAsync(fileContent).

Microsoft.WindowsAzure.Storage.CloudBlockBlob : Microsoft.WindowsAzure.Storage.Blob.ICloudBlob

Но CloudStorageAccount не реализует интерфейс, поэтому не похоже, что я могу его высмеять.

Вот некоторый пример кода модульного тестирования, основанный на том, что я понимаю о насмешках и собранных вместе для этого конкретного сценария:

var cloudBlockBlobMock = new Mock<ICloudBlob>();
cloudBlockBlobMock
    .Setup(cbb => cbb.UploadTextAsync("test"))
    .Throws<HttpException>();
var fileUploader = new FileUploader(cloudBlockBlobMock);
fileUploader.CreateFileAsync("test");

Является ли CreateFileAsync() модульно-тестируемым?

Возможно ли / допустимо издеваться над дочерним объектом без насмешки над его родительским объектом?

1 Ответ

0 голосов
/ 20 декабря 2018

Microsoft выбрала другой подход к тестированию модуля libs.Вместо реализации интерфейсов у типов есть большинство методов виртуальных.Например, метод CloudStorageAccount.CreateCloudBlobClient является виртуальным. Вы можете высмеивать их в Moq.

Или вы можете использовать обертку, которая оборачивает реализацию в интерфейсе, и использовать ее.См., Например, Microsoft / Azure.Data.Wrappers или pvredeveld / Azure.Storage.Wrappers .Это обеспечит интерфейс, который вы можете смоделировать, но вам придется изменить существующую кодовую базу, чтобы использовать их.

...