Question

Je souhaite exécuter du code JavaScript à partir d'un assemblage C # et obtenir les résultats du code JavaScript renvoyés au code C # appelant.

Il est plus facile de définir des choses que je n'essaie pas de faire:

  • Je n'essaie pas d'appeler une fonction JavaScript sur une page Web à partir de mon code précédent.

  • Je n'essaie pas de charger un contrôle WebBrowser.

  • Je ne souhaite pas que JavaScript effectue un appel AJAX vers un serveur.

Ce que je veux faire, c’est écrire des tests unitaires en JavaScript et obtenir ensuite une sortie de tests unitaires au format JSON. Ensuite, je souhaite avoir une classe / un exécutable C # générique capable de charger le fichier contenant le JS, d'exécuter les tests d'unité JS, d'extraire / de charger les résultats et de renvoyer une réussite / un échec avec des détails lors d'une tâche post-génération.

Je pense qu'il est possible d'utiliser l'ancien ActiveX ScriptControl, mais il semble qu'il devrait exister une méthode .NET pour le faire sans utiliser SilverLight, le DLR ou tout autre élément non encore livré. Quelqu'un a des idées?

mise à jour: du blog de Brad Abrams

namespace Microsoft.JScript.Vsa
{
    [Obsolete("There is no replacement for this feature. " +
              "Please see the ICodeCompiler documentation for additional help. " +
              "http://go.microsoft.com/fwlink/?linkid=14202")]

Clarification: Nous avons des tests unitaires pour nos fonctions JavaScript écrites en JavaScript à l'aide du framework JSUnit. Pour le moment, pendant notre processus de construction, nous devons charger manuellement une page Web et cliquer sur un bouton pour vérifier que tous les tests unitaires JavaScript réussissent. J'aimerais pouvoir exécuter les tests pendant le processus de post-construction lorsque nos tests d'unités automatisés C # sont exécutés et signaler le succès / l'échec à côté des tests d'unités C # et les utiliser pour indiquer si oui ou non la construction est cassé.

Était-ce utile?

La solution

Vous pouvez exécuter votre JSUnit depuis Nant à l’aide du serveur JSUnit, il est écrit en java et il n’existe pas de tâche Nant, mais vous pouvez l’exécuter à partir de l’invite de commande. Les résultats sont consignés en tant que XML et vous pouvez les intégrer. votre processus de rapport de construction. Cela ne fera pas partie de votre résultat Nunit mais d'un rapport supplémentaire. Nous échouons à la construction si l'un de ces tests échoue. Nous faisons exactement cela en utilisant CC.Net.

Autres conseils

Le code devrait être assez explicite, je vais donc poster ça.

<add assembly="Microsoft.Vsa, Version=8.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/></assemblies>
    using Microsoft.JScript;

    public class MyClass {

    public static Microsoft.JScript.Vsa.VsaEngine Engine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();

        public static object EvaluateScript(string script)
        {
            object Result = null;
            try
            {
                Result = Microsoft.JScript.Eval.JScriptEvaluate(JScript, Engine);
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

            return Result;
        }

        public void MyMethod() {
            string myscript = ...;
            object myresult = EvaluateScript(myscript);
        }


    }

Vous pouvez utiliser le moteur Javascript Microsoft pour évaluer le code JavaScript à partir de C #

Mise à jour: obsolète à compter de VS 2008

Je ne connais aucun moyen spécifique .NET de faire cela pour le moment ... Bien, il reste JScript.NET, mais ce ne sera probablement pas compatible avec le JS que vous devez exécuter:)

Évidemment, l’avenir serait l’implémentation .NET JScript du DLR qui arrive ... un jour (avec un peu de chance).

Cela laisse donc probablement fonctionner l'ancien moteur JScript ActiveX, ce qui est certainement possible à partir de .NET (je l'ai déjà fait par le passé, même si c'est un peu moche!).

Si vous n'exécutez pas le code dans le contexte d'un navigateur, pourquoi les tests doivent-ils être écrits en Javascript? Il est difficile de comprendre l’ensemble de ce que vous essayez d’accomplir ici.

Pourrait-il être plus simple d'utiliser JSUnit pour écrire vos tests, puis utiliser un WatiN  tester l’encapsuleur pour les exécuter en C #, en passant ou en échouant sur la base des résultats JSUnit?

C’est certes une étape supplémentaire cependant.

Je pense avoir lu quelque part qu'une version future de MBUnit ou de WatiN intègrera la fonctionnalité permettant de traiter les montages de test JSUnit. Si seulement je pouvais me rappeler où j'ai lu ça ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top