l'éditeur php Baicao vous présente comment utiliser la cadence RegisterDelayedCallback dans les tests unitaires pour effectuer le même flux de travail. Dans les tests unitaires, nous devons souvent simuler des opérations asynchrones pour garantir l'exactitude du code dans diverses circonstances. cadence RegisterDelayedCallback est un outil puissant qui peut nous aider à simuler des fonctions de rappel retardé dans les tests. En utilisant RegisterDelayedCallback, nous pouvons facilement simuler des opérations asynchrones, garantir l'exactitude du code dans diverses situations et être capables de reproduire et de résoudre des problèmes potentiels. Dans cet article, nous explorerons comment utiliser la cadence RegisterDelayedCallback pour effectuer le même flux de travail afin de vous aider à améliorer les tests unitaires.
Est-il possible d'exécuter des tests unitaires en utilisant registerdelayedcallback
qui effectue le même workflow de cadence ?
J'ai le code suivant qui exécute le workflow deux fois, la première exécution enregistre le jeton de rappel et la deuxième exécution récupère le jeton enregistré pour terminer l'activité de manière asynchrone.
workflow.go
package workflow import ( "context" "encoding/base64" "fmt" "go.uber.org/cadence/activity" "go.uber.org/cadence/workflow" ) type workflowimpl struct { worker.worker client.client } func (w workflowimpl) tactivity(ctx context.context, action string) error { fmt.println("tactivity started", action) if action != "approved" { activityinfo := activity.getinfo(ctx) callbacktoken := base64.stdencoding.encodetostring(activityinfo.tasktoken) fmt.println("save callbacktoken", callbacktoken) // saves callbacktoken. return activity.errresultpending } fmt.println("approved") // do some approved things. // get saved callback token. // call w.completeactivity() with the saved callback token. return nil } func (w workflowimpl) tworkflow(ctx workflow.context, action string) (result string, err error) { fmt.println("tworkflow started", action) waitchannel := workflow.newchannel(ctx) workflow.go(ctx, func(ctx workflow.context) { if err := workflow.executeactivity(ctx, w.tactivity, action).get(ctx, nil); err != nil { // do nothing, keep workflow open. return } waitchannel.send(ctx, "ok") }) var signal string waitchannel.receive(ctx, &signal) return signal, nil }
workflow_test.go
package workflow_test import ( "time" "go.uber.org/cadence/worker" ) func (s *UnitTestSuite) Test_TWorkflow() { env := s.NewTestWorkflowEnvironment() worker := workflow.WorkflowImpl{ Worker: ... Client: ... } s.worker = &worker env.RegisterActivity(s.worker.TActivity) // Delay second TWorkflow. env.RegisterDelayedCallback(func() { env.ExecuteWorkflow(s.worker.TWorkflow, "Approved") }, time.Second*2) env.ExecuteWorkflow(s.worker.TWorkflow, "Noop") s.True(env.IsWorkflowCompleted()) s.NoError(env.GetWorkflowError()) }
Le code ci-dessus n'est pas complet, il n'enregistre pas le jeton de rappel et l'activité complète de l'appel. Dans le but de tester la séquence, j'aimerais simplement voir le journal du démarrage du flux de travail et de l'activité commençant deux fois, mais je ne le vois pas. Après le démarrage du premier flux de travail, s'il n'y a aucun journal actif, le test se bloquera jusqu'à expiration.
Qu'est-ce qui me manque ou est-il possible d'exécuter deux fois le même workflow comme celui-ci ?
env.registerdelayedcallback(func() { env.executeworkflow(s.worker.tworkflow, "approved") }, time.second*2)
Il y a une impasse ici. Obtenez le même verrou sur env
在回调运行时被锁定(请参阅 源代码)。并且回调想要在同一个 env
上执行工作流,这需要在 env
(voir code source).
Essayons de sortir de l'impasse en exécutant le rappel dans une nouvelle goroutine :
env.registerdelayedcallback(func() { go env.executeworkflow(s.worker.tworkflow, "approved") }, time.second*2)
Maintenant, nous paniquons :
panic: Current TestWorkflowEnvironment is used to execute s.worker.TWorkflow. Please create a new TestWorkflowEnvironment for s.worker.TWorkflow.
Actuellement, testworkflowenvironment
ne peut pas exécuter 2 workflows non parent-enfant. Voir le problème du suivi des tâches pour activer l'environnement de testworkflow pour prendre en charge le test de plusieurs flux de travail .
Comme le suggère le message de panique, vous devez créer un nouveau testworkflowenvironment
pour exécuter un autre workflow (mais je ne sais pas s'il convient à votre cas d'utilisation).
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!