C# 单元测试活动功能时IBinder模拟失败

C# 单元测试活动功能时IBinder模拟失败,c#,unit-testing,moq,azure-functions,azure-durable-functions,C#,Unit Testing,Moq,Azure Functions,Azure Durable Functions,我正在尝试测试具有以下定义的活动函数: [FunctionName(nameof(LoadReferenceFromBlobStorage))] public static async Task<string> Run([ActivityTrigger] string blobName, IBinder binder, ILogger log) { StorageAccountAttribute storageAccountAtt = new StorageA

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

[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();

    //...
}
测试成功调用活动,但
binder.BindAsync
的结果始终为空


我遗漏了什么吗?

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

测试中的方法正在使用硬编码的
“AzureWebJobsStorage”
创建自己的
StorageAccountAttribute
实例,同时测试正在使用另一个实例作为设置表达式。在执行测试时,这些将不匹配,因此模拟将按经验返回null

尝试使用
It来放松设置。IsAny()
是期望表达式

//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 mockedResult=null;
TryParse(“UseDevelopmentStorage=true;”,out-mockedResult);
var mock=new mock();
嘲弄
.Setup(x=>x.BindAsync(It.IsAny(),CancellationToken.None))
.ReturnsAsync(mockedResult);
ILogger logger=Mock.Of();
//表演
var res=await loadreferencefrombrobstorage.Run(“name”,mock.Object,logger);
//断言
//...
这将允许

 CloudStorageAccount storageAccount = await binder.BindAsync<CloudStorageAccount>(storageAccountAtt, CancellationToken.None);
CloudStorageAccount-storageAccount=await binder.BindAsync(storageAccountAtt,CancellationToken.None);
调用时按预期操作

关于<代码> SturtActActudioActudio>(代码)>硬编码的参数,您可能还想考虑重构,以便在测试时可以替换它,以便在测试时不使用存储的问题。

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