Maison > développement back-end > Golang > Comment puis-je effectuer le même flux de travail en utilisant la cadence RegisterDelayedCallback dans un test unitaire ?

Comment puis-je effectuer le même flux de travail en utilisant la cadence RegisterDelayedCallback dans un test unitaire ?

WBOY
Libérer: 2024-02-10 10:50:09
avant
682 Les gens l'ont consulté

如何在单元测试中使用 cadence RegisterDelayedCallback 执行相同的工作流程?

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.

Contenu de la question

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
}
Copier après la connexion

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())
}
Copier après la connexion

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 ?

Solution

env.registerdelayedcallback(func() {
    env.executeworkflow(s.worker.tworkflow, "approved")
}, time.second*2)
Copier après la connexion

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)
Copier après la connexion

Maintenant, nous paniquons :

panic: Current TestWorkflowEnvironment is used to execute s.worker.TWorkflow. Please create a new TestWorkflowEnvironment for s.worker.TWorkflow.
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal