Pregunta

Me gustaría ejecutar código JavaScript desde un ensamblado de C# y que los resultados del código JavaScript se devuelvan al código C# que realiza la llamada.

Es más fácil definir cosas que no estoy tratando de hacer:

  • No estoy intentando llamar a una función de JavaScript en una página web desde mi código subyacente.

  • No estoy intentando cargar un control WebBrowser.

  • No quiero que JavaScript realice una llamada AJAX a un servidor.

Lo que quiero hacer es escribir pruebas unitarias en JavaScript y luego hacer que las pruebas unitarias generen JSON, incluso texto sin formato estaría bien.Luego, quiero tener una clase/ejecutable genérico de C# que pueda cargar el archivo que contiene JS, ejecutar las pruebas unitarias de JS, descartar/cargar los resultados y devolver un aprobado/reprobado con detalles durante una tarea posterior a la compilación.

Creo que es posible usar el antiguo ActiveX ScriptControl, pero parece que debería haber una forma .NET de hacerlo sin usar SilverLight, DLR o cualquier otra cosa que aún no se haya distribuido.¿Alguien tiene alguna idea?

actualizar: Del 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")]

Aclaración:Tenemos pruebas unitarias para nuestras funciones de JavaScript que están escritas en JavaScript utilizando el marco JSUnit.En este momento, durante nuestro proceso de compilación, tenemos que cargar manualmente una página web y hacer clic en un botón para asegurarnos de que se aprueben todas las pruebas unitarias de JavaScript.Me gustaría poder ejecutar las pruebas durante el proceso posterior a la compilación cuando se ejecutan nuestras pruebas unitarias automatizadas de C# e informar el éxito/fracaso junto con nuestras pruebas unitarias de C# y utilizarlas como indicador de si la compilación se completó o no. está roto.

¿Fue útil?

Solución

Puede ejecutar su JSUnit desde Nant usando el servidor JSUnit, está escrito en Java y no hay una tarea de Nant, pero puede ejecutarlo desde el símbolo del sistema, los resultados se registran como XML y puede integrarlos con su informe de compilación. proceso.Esto no será parte de su resultado de Nunit sino un informe adicional.Fallamos la compilación si alguna de esas pruebas falla.Estamos haciendo exactamente eso usando CC.Net.

Otros consejos

El código debería explicarse por sí mismo, así que lo publicaré.

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


    }

Puede utilizar el motor Microsoft Javascript para evaluar código JavaScript desde C#

Actualizar:Esto está obsoleto a partir de VS 2008.

No conozco ninguna forma específica de .NET de hacer esto en este momento...Bueno, todavía existe JScript.NET, pero probablemente no será compatible con cualquier JS que necesites ejecutar :)

Obviamente el futuro sería la implementación de .NET JScript para el DLR que está por llegar...algún día (con suerte).

Así que probablemente eso deje de ejecutar el antiguo motor ActiveX JScript, que ciertamente es posible hacerlo desde .NET (lo he hecho en el pasado, ¡aunque es un poco feo!).

Si no ejecuta el código en el contexto de un navegador, ¿por qué es necesario escribir las pruebas en Javascript?Es difícil entender el panorama más amplio de lo que estás tratando de lograr aquí.

¿Podría ser más sencillo de usar? Unidad JSU para escribir sus pruebas y luego usar un WatiN¿Prueba el contenedor para ejecutarlos a través de C#, pasando o fallando según los resultados de JSUnit?

De hecho, es un paso adicional.

Creo que leí en alguna parte que una próxima versión de MBUnit o WatiN tendrá la funcionalidad integrada para procesar dispositivos de prueba JSUnit.Si pudiera recordar dónde leí eso...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top