Domanda

Mi piacerebbe eseguire il codice JavaScript dall'interno di un assembly C# e restituire i risultati del codice JavaScript al codice C# chiamante.

È più facile definire le cose che non sto cercando di fare:

  • Non sto cercando di chiamare una funzione JavaScript su una pagina web dal mio codice dietro.

  • Non sto cercando di caricare un controllo WebBrowser.

  • Non voglio che JavaScript esegua una chiamata AJAX a un server.

Quello che voglio fare è scrivere test unitari in JavaScript e quindi fare in modo che i test unitari restituiscano JSON, anche il testo semplice andrebbe bene.Quindi voglio avere una classe/eseguibile C# generico in grado di caricare il file contenente JS, eseguire gli unit test JS, scartare/caricare i risultati e restituire un pass/fail con i dettagli durante un'attività di post-compilazione.

Penso che sia possibile utilizzare il vecchio ActiveX ScriptControl, ma sembra che dovrebbe esserci un modo .NET per farlo senza utilizzare SilverLight, DLR o qualsiasi altra cosa non ancora disponibile.Qualcuno ha qualche idea?

aggiornamento: Dal blog di 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")]

Una precisazione:Abbiamo test unitari per le nostre funzioni JavaScript scritte in JavaScript utilizzando il framework JSUnit.In questo momento, durante il processo di creazione, dobbiamo caricare manualmente una pagina Web e fare clic su un pulsante per garantire che tutti gli unit test JavaScript vengano superati.Mi piacerebbe essere in grado di eseguire i test durante il processo di post-compilazione quando vengono eseguiti i nostri unit test C# automatizzati e segnalare il successo/fallimento insieme agli unit test C# e usarli come indicatore per stabilire se la build è stata completata o meno è rotta.

È stato utile?

Soluzione

Puoi eseguire la tua JSUnit dall'interno di Nant utilizzando il server JSUnit, è scritto in Java e non c'è un'attività Nant ma puoi eseguirla dal prompt dei comandi, i risultati vengono registrati come XML e puoi integrarli con il tuo report di build processi.Questo non farà parte del tuo risultato Nunit ma di un rapporto extra.Falliamo la compilazione se uno qualsiasi di questi test fallisce.Stiamo facendo esattamente questo utilizzando CC.Net.

Altri suggerimenti

Il codice dovrebbe essere abbastanza autoesplicativo, quindi lo pubblicherò semplicemente.

<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);
        }


    }

È possibile utilizzare il motore Javascript Microsoft per valutazione del codice JavaScript da C#

Aggiornamento:Questo è obsoleto a partire da VS 2008

Non conosco alcun modo specifico per .NET per farlo in questo momento...Bene, c'è ancora JScript.NET, ma probabilmente non sarà compatibile con qualunque JS tu debba eseguire :)

Ovviamente il futuro sarebbe l'implementazione .NET JScript per DLR che sta arrivando...un giorno (si spera).

Quindi questo probabilmente lascia in esecuzione il vecchio motore ActiveX JScript, che è certamente possibile farlo da .NET (l'ho fatto in passato, anche se è un po' brutto!).

Se non stai eseguendo il codice nel contesto di un browser, perché i test devono essere scritti in Javascript?È difficile comprendere il quadro più ampio di ciò che stai cercando di realizzare qui.

Potrebbe essere più semplice da usare JSUnit per scrivere i tuoi test, quindi utilizzare a WatiNtest wrapper per eseguirli tramite C#, passando o fallendo in base ai risultati JSUnit?

In effetti è un passo in più però.

Credo di aver letto da qualche parte che una prossima versione di MBUnit o WatiN avrà la funzionalità integrata per elaborare i dispositivi di test JSUnit.Se solo potessi ricordare dove l'ho letto...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top