Maison  >  Article  >  développement back-end  >  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
WBOYavant
2024-02-10 10:50:09642parcourir

如何在单元测试中使用 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
}

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 ?

Solution

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer