使用 xUnit 和 FakeItEasy 对 Azure 函数 v3 进行单元测试

问题描述

我正在尝试对 Azure v3 HTTP 触发器实施一些单元/集成测试,但在该过程中遇到了一些问题。

我之前为使用如下语法的 API 控制器编写了一些测试:

TransactionResponse fakeResponse = new TransactionResponse { APIResponse = "Okay" };

var fakeSbus = A.Fake<IServiceBusPlatform>();
var fakeTransaction = A.Fake<ITransaction>();
            
A.CallTo(() => fakeTransaction.CreateTransaction(tran)).Returns(Task.FromResult(fakeResponse.APIResponse));
var controller = new SubmitController(fakeSbus,fakeTransaction);

var result = await controller._transaction.CreateTransaction(tran);
Assert.Equal(fakeResponse.APIResponse,result.ToString());

这很有效,因为它只是测试 dbcontext 然后断言返回。

我试图对 Azure 函数做的是根据 OkObjectResult 评估触发器,但在函数内部,我有一些方法调用,然后是依赖于方法调用结果的逻辑。 (返回一个列表,使用 ListMember[0] 的属性来声明一个 var)。像这样:

var BatchResults = await _dbService.RetrieveBatch(session);
var CompanyID = BatchResults[0].CompanyID;

更新:为了更清晰,这里是整个测试功能:

var fakeBatch = new List<RetrievedBatch>();
fakeBatch.Add(new RetrievedBatch
{
  CompanyID = new Guid(),});


var testResponse = new OkObjectResult("OKAY");
var request = A.Fake<HttpRequest>();
request.Method = "POST";
            
byte[] byteArray = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(fakeTransaction));
MemoryStream stream = new MemoryStream(byteArray);
request.Body = stream;

var logger = A.Fake<ILogger>();

var fakeService = A.Fake<IDbService>();

A.CallTo(() => fakeService.RetrieveBatch(fakeTransaction)).Returns(fakeBatch);

var test = fakeService.RetrieveBatch(fakeTransaction);

var SM = new SessionManager(fakeService);
var response = await SM.Run(request,logger);

哦,接口里面的方法/类型是这样的:

Task<List<RetrievedBatch>> RetrieveBatch(Transaction session);

错误发生在 SM.Run(x,y) 内部。经过一些调试,我可以看到 A.CallTo 在测试函数内部返回了正确的结果,但是在运行 Azure 函数时,该值没有被结转,这是代码破坏问题。

感谢任何帮助,因为我花了太多时间试图解决这个问题,而且所有示例都是基本的,不幸的是在这种情况下不是很有帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)