Test des modèles App Engine avec des chemins personnalisés
Lorsque vous utilisez le package de modèles avec Go sur App Engine, vous pouvez rencontrer un problème de résolution de fichiers lors des tests unitaires. Le test unitaire échoue avec l'erreur "open templates/index.html: no such file or directory", indiquant que le serveur ne peut pas localiser le fichier modèle.
La solution à ce problème réside dans la compréhension de la différence entre les racine de l'application (où réside app.yaml) et le répertoire actuel lors de l'exécution de tests unitaires. Les tests unitaires sont généralement exécutés dans le dossier contenant le fichier *_test.go, qui n'est pas la racine de l'application. Les chemins de fichiers relatifs qui fonctionnent correctement lors de l'exécution normale de l'application ne seront pas résolus correctement lors de l'exécution des tests.
Pour résoudre ce problème, vous pouvez soit :
1. Remplacez le répertoire de travail par la racine de l'application :
Utilisez os.Chdir() pour accéder au répertoire racine de l'application dans votre fichier de test, qui se trouve généralement à 2 niveaux au-dessus de l'emplacement du fichier de test. Par exemple :
func init() { if err := os.Chdir("../.."); err != nil { panic(err) } }
Notez que cela doit être fait dans la fonction init() ou appelé explicitement dans la méthode de test.
2. Refactoriser le code :
Au lieu d'utiliser des chemins de fichiers relatifs, refactorisez le code pour transmettre la racine de l'application en tant que paramètre ou variable. Cela vous permet de spécifier le chemin de base pour la résolution relative des fichiers lors des tests unitaires indépendamment du répertoire actuel.
// Package scope variable for passing the app root var appRoot string func pageIndex(w http.ResponseWriter, r *http.Request) { tpls := append([]string{"templates/index.html"}, templates...) tpl := template.Must(template.ParseFiles(append([]string{appRoot}, tpls...)...)) // ... } // Function to initialize the app root before running tests func TestMain(m *testing.M) { // Set appRoot to the absolute path of the app root appRoot = "../.." // ... os.Exit(m.Run()) }
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!