gpt4 book ai didi

c# - IBinder 的模拟在单元测试事件功能时失败

转载 作者:太空宇宙 更新时间:2023-11-03 14:45:00 25 4
gpt4 key购买 nike

我正在尝试测试具有以下定义的事件函数:

[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

我错过了什么吗?

最佳答案

您正在比较设置中的两个单独实例和测试中实际调用的实例。

被测方法正在创建自己的 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硬编码参数,您可能还需要考虑重构,以便在测试时可以替换它,以免测试时使用的存储出现问题。

关于c# - IBinder 的模拟在单元测试事件功能时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54812373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com