本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Step Functions 中模拟服务集成的配置文件
要使用模拟服务集成,必须先创建一个名为 MockConfigFile.json
的模拟配置文件,其中包含您的模拟配置。然后将模拟配置文件提供给 Step Functions Local。此配置文件定义了测试用例,其中包含使用模拟服务集成响应的模拟状态。下一节将介绍包含模拟状态和模拟响应的模拟配置结构:
模拟配置文件结构
模拟配置是一个包含以下顶级字段的JSON对象:
-
StateMachines
- 该对象的字段表示配置为使用模拟服务集成的状态机。 -
MockedResponse
- 该对象的字段表示服务集成调用的模拟响应。
以下是一个模拟配置文件示例,其中包含 StateMachine
定义和 MockedResponse
。
{
"StateMachines":{
"LambdaSQSIntegration":{
"TestCases":{
"HappyPath":{
"LambdaState":"MockedLambdaSuccess",
"SQSState":"MockedSQSSuccess"
},
"RetryPath":{
"LambdaState":"MockedLambdaRetry",
"SQSState":"MockedSQSSuccess"
},
"HybridPath":{
"LambdaState":"MockedLambdaSuccess"
}
}
}
},
"MockedResponses":{
"MockedLambdaSuccess":{
"0":{
"Return":{
"StatusCode":200,
"Payload":{
"StatusCode":200,
"body":"Hello from Lambda!"
}
}
}
},
"LambdaMockedResourceNotReady":{
"0":{
"Throw":{
"Error":"Lambda.ResourceNotReadyException",
"Cause":"Lambda resource is not ready."
}
}
},
"MockedSQSSuccess":{
"0":{
"Return":{
"MD5OfMessageBody":"3bcb6e8e-7h85-4375-b0bc-1a59812c6e51",
"MessageId":"3bcb6e8e-8b51-4375-b0bc-1a59812c6e51"
}
}
},
"MockedLambdaRetry":{
"0":{
"Throw":{
"Error":"Lambda.ResourceNotReadyException",
"Cause":"Lambda resource is not ready."
}
},
"1-2":{
"Throw":{
"Error":"Lambda.TimeoutException",
"Cause":"Lambda timed out."
}
},
"3":{
"Return":{
"StatusCode":200,
"Payload":{
"StatusCode":200,
"body":"Hello from Lambda!"
}
}
}
}
}
}
模拟配置字段参考
以下部分将说明必须在模拟配置中定义的顶层对象字段。
StateMachines
StateMachines
对象定义哪些状态机将使用模拟服务集成。每个状态机的配置都用 StateMachines
的顶级字段表示。字段名称是状态机的名称,值是包含名为 TestCases
的单个字段的对象,其字段代表该状态机的测试用例。
以下语法显示了带有两个测试用例的状态机:
"MyStateMachine": {
"TestCases": {
"HappyPath": {
...
},
"SadPath": {
...
}
}
TestCases
TestCases
字段表示状态机的各个测试用例。每个状态机的测试用例名称必须是唯一的,每个测试用例的值都是一个对象,指定了状态机中 Task 状态使用的模拟响应。
以下 TestCase
示例将两个 Task
状态与两个 MockedResponses
联系起来:
"HappyPath": {
"SomeTaskState": "SomeMockedResponse",
"AnotherTaskState": "AnotherMockedResponse"
}
MockedResponses
MockedResponses
是一个对象,包含多个具有唯一字段名称的模拟响应对象。模拟响应对象定义了每次调用模拟 Task 状态时的成功结果或错误输出。您可以使用单个整数字符串(例如 “0”、“1”、“2” 和 “3”)或包含整数的范围(例如 “0-1”、“2-3”)来指定调用次数。
模拟 Task 时,必须为每次调用指定一个模拟响应。响应必须包含一个名为 Return
或 Throw
的单个字段,其值为模拟 Task 调用的结果或错误输出。如果未指定模拟响应,则状态机执行将失败。
下面是一个包含 Throw
和 Return
对象的 MockedResponse
示例。在此示例中,状态机运行的前三次返回 "0-2"
中指定的响应,状态机运行的第四次返回 "3"
中指定的响应。
"SomeMockedResponse": {
"0-2": {
"Throw": {
...
}
},
"3": {
"Return": {
...
}
}
}
注意
如果使用的是 Map
状态,并且希望确保 Map
状态的响应具有可预测性,请将 maxConcurrency
的值设置为 1。如果您设置的值大于 1,Step Functions Local 将同时运行多次迭代,这将导致各迭代状态的整体执行顺序不可预测。这可能会进一步导致 Step Functions Local 在每次执行时对迭代状态使用不同的模拟响应。
Return
Return
表示为 MockedResponse
对象的一个字段。它指定了模拟 Task 状态的成功结果。
下面是一个 Return
对象的示例,其中包含在 Lambda 函数上调用 Invoke
时的模拟响应:
"Return": {
"StatusCode": 200,
"Payload": {
"StatusCode": 200,
"body": "Hello from Lambda!"
}
}
Throw
Throw
表示为 MockedResponse
对象的一个字段。它指定失败 Task 的错误输出。Throw
的值必须是一个对象,其中包含带有字符串值的 Error
和 Cause
字段。此外,您在 MockConfigFile.json
中指定的 Error
字段的字符串值必须与状态机的 Retry
和 Catch
部分处理的错误相匹配。
下面是一个 Throw
对象的示例,其中包含在 Lambda 函数上调用 Invoke
时的模拟响应:
"Throw": {
"Error": "Lambda.TimeoutException",
"Cause": "Lambda timed out."
}