Сбой макета IBinder при модульном тестировании. - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь проверить функцию активности, которая имеет следующее определение:

[FunctionName(nameof(LoadReferenceFromBlobStorage))]
public static async Task<string> Run([ActivityTrigger] string blobName,
    IBinder binder,
    ILogger log)
{
    StorageAccountAttribute storageAccountAtt = new StorageAccountAttribute("AzureWebJobsStorage");
    CloudStorageAccount storageAccount = await binder.BindAsync<CloudStorageAccount>(storageAccountAtt, CancellationToken.None);
    CloudBlobClient client = storageAccount.CreateCloudBlobClient();

    //...
}

Я высмеиваю IBinder в модульном тесте как:

[TestMethod]
public async Task GetReference()
{
    var attribute = new StorageAccountAttribute("UseDevelopmentStorage=true;");
    var mock = new Mock<IBinder>();
    CloudStorageAccount mockedResult = null;
    CloudStorageAccount.TryParse("UseDevelopmentStorage=true;", out mockedResult);
    mock.Setup(x => x.BindAsync<CloudStorageAccount>(attribute, CancellationToken.None))
            .ReturnsAsync(mockedResult);

    ILogger logger = NullLoggerFactory.Instance.CreateLogger("log");
    var res = await LoadReferenceFromBlobStorage.Run("name", mock.Object, logger);

    //...
}

Тестовые вызовыактивность успешно, но результат binder.BindAsync всегда null .

Я что-то упустил?

1 Ответ

0 голосов
/ 21 февраля 2019

Вы сравниваете два отдельных экземпляра в настройке и то, что фактически вызывается в тесте.

Тестируемый метод создает свой собственный экземпляр StorageAccountAttribute с жестко заданным кодом "AzureWebJobsStorage", в то время как тест использует другой экземпляр для выражения установки.Они не будут совпадать при выполнении теста, и, таким образом, макет вернет null как опытный.

Попробуйте ослабить настройку, используя It.IsAny<T>() - выражение ожидания.

//Arrange    
CloudStorageAccount mockedResult = null;
CloudStorageAccount.TryParse("UseDevelopmentStorage=true;", out mockedResult);

var mock = new Mock<IBinder>();
mock
    .Setup(x => x.BindAsync<CloudStorageAccount>(It.IsAny<StorageAccountAttribute>(), CancellationToken.None))
    .ReturnsAsync(mockedResult);

ILogger logger = Mock.Of<ILogger>();
//Act
var res = await LoadReferenceFromBlobStorage.Run("name", mock.Object, logger);

//Assert

//...

Это позволит

 CloudStorageAccount storageAccount = await binder.BindAsync<CloudStorageAccount>(storageAccountAtt, CancellationToken.None);

вести себя, как и ожидалось, при вызове.

Что касается жестко закодированного аргумента StorageAccountAttribute, вы можете также подумать о рефакторинге, чтобы он мог бытьзаменяется при тестировании, чтобы не было проблем с хранилищем, используемым при тестировании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...