Azure Function 服务调用单元测试的最小起订量不 return 设置值
Moq for Azure Function service call Unit Test does not return the Setup value
我有一个服务 class (DataStore.cs) 从 Azure Table 检索值。我正在测试使用服务 class 作为成功案例的方法。服务的 Mock class 方法没有 return 预期值(它 return 为 null)
正在测试的方法是
public static class GetCellarBottleDetails
{
[FunctionName("GetCellarBottleDetails")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
ILogger log, ExecutionContext context, IDataStore dataStore = null)
{
log.LogInformation("Begin GetCellarBottleDetails request");
var stream = req.Body;
stream.Seek(0, SeekOrigin.Begin);
var azureTaskString = await new StreamReader(stream).ReadToEndAsync();
var key = JsonConvert.DeserializeObject<AzureTableKey>(azureTaskString);
if (key == null)
{
log.LogError($"Failed to Retrieve Bottle Details for Azure Table Key provided: {azureTaskString}");
return new StatusCodeResult(400);
}
log.LogInformation("GetCellarBottleDetails Api Request initiated");
dataStore ??= new DataStore(log, context);
var result = await dataStore.GetCellarBottleDetails(key);
if (result != null && result.GetType() == typeof(BottleDetailModel))
return new OkObjectResult(JsonConvert.SerializeObject(result));
log.LogError($"Failed to get bottle detail from DataStore.");
return new StatusCodeResult(500);
}
}
服务class方法签名是:
public async Task<BottleDetailModel> GetCellarBottleDetails(AzureTableKey BottleId)
我的模拟和设置是:
var ds = TestHelpers.CreateMockDataStore();
ds.Setup(s => s.GetCellarBottleDetails(TestParams.TestExpectedAzureTableKeyForBottle))
.Returns(Task.FromResult<BottleDetailModel>(TestParams.TestExpectedBottleDetailModel));
//.ReturnsAsync(TestParams.TestExpectedBottleDetailModel);
我已经根据其他 Whosebug 答案尝试了“.Returns”和“.ReturnsAsync”,它们都产生了 null 的结果。
我对服务的调用如下:
var sut = await GetCellarBottleDetails.Run(
TestHelpers.CreateMockRequest(TestParams.TestExpectedAzureTableKeyForBottle).Object,
TestHelpers.CreateMockLogger().Object,
TestHelpers.CreateMockExecutionContext().Object, ds.Object);
我错过了什么?
AzureTableKey
是一个对象。但是,您在 CreateMockRequest
函数中创建主体,AzureTableKey
的实例与对象反序列化期间创建的实例不同。
所以它们与设置不匹配。
尝试使用 It.IsAny<AzureTableKey>()
来验证我的声明。
ds.Setup(s => s.GetCellarBottleDetails(It.IsAny<AzureTableKey>()))
.Returns(Task.FromResult<BottleDetailModel>(TestParams.TestExpectedBottleDetailModel));
我有一个服务 class (DataStore.cs) 从 Azure Table 检索值。我正在测试使用服务 class 作为成功案例的方法。服务的 Mock class 方法没有 return 预期值(它 return 为 null)
正在测试的方法是
public static class GetCellarBottleDetails
{
[FunctionName("GetCellarBottleDetails")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
ILogger log, ExecutionContext context, IDataStore dataStore = null)
{
log.LogInformation("Begin GetCellarBottleDetails request");
var stream = req.Body;
stream.Seek(0, SeekOrigin.Begin);
var azureTaskString = await new StreamReader(stream).ReadToEndAsync();
var key = JsonConvert.DeserializeObject<AzureTableKey>(azureTaskString);
if (key == null)
{
log.LogError($"Failed to Retrieve Bottle Details for Azure Table Key provided: {azureTaskString}");
return new StatusCodeResult(400);
}
log.LogInformation("GetCellarBottleDetails Api Request initiated");
dataStore ??= new DataStore(log, context);
var result = await dataStore.GetCellarBottleDetails(key);
if (result != null && result.GetType() == typeof(BottleDetailModel))
return new OkObjectResult(JsonConvert.SerializeObject(result));
log.LogError($"Failed to get bottle detail from DataStore.");
return new StatusCodeResult(500);
}
}
服务class方法签名是:
public async Task<BottleDetailModel> GetCellarBottleDetails(AzureTableKey BottleId)
我的模拟和设置是:
var ds = TestHelpers.CreateMockDataStore();
ds.Setup(s => s.GetCellarBottleDetails(TestParams.TestExpectedAzureTableKeyForBottle))
.Returns(Task.FromResult<BottleDetailModel>(TestParams.TestExpectedBottleDetailModel));
//.ReturnsAsync(TestParams.TestExpectedBottleDetailModel);
我已经根据其他 Whosebug 答案尝试了“.Returns”和“.ReturnsAsync”,它们都产生了 null 的结果。
我对服务的调用如下:
var sut = await GetCellarBottleDetails.Run(
TestHelpers.CreateMockRequest(TestParams.TestExpectedAzureTableKeyForBottle).Object,
TestHelpers.CreateMockLogger().Object,
TestHelpers.CreateMockExecutionContext().Object, ds.Object);
我错过了什么?
AzureTableKey
是一个对象。但是,您在 CreateMockRequest
函数中创建主体,AzureTableKey
的实例与对象反序列化期间创建的实例不同。
所以它们与设置不匹配。
尝试使用 It.IsAny<AzureTableKey>()
来验证我的声明。
ds.Setup(s => s.GetCellarBottleDetails(It.IsAny<AzureTableKey>()))
.Returns(Task.FromResult<BottleDetailModel>(TestParams.TestExpectedBottleDetailModel));