Pergunta

Gostaria de executar o código JavaScript de dentro de um assembly C# e ter os resultados do código JavaScript retornados ao código C# de chamada.

É mais fácil definir coisas que não estou tentando fazer:

  • Não estou tentando chamar uma função JavaScript em uma página da web a partir do meu código por trás.

  • Não estou tentando carregar um controle WebBrowser.

  • Não quero que o JavaScript execute uma chamada AJAX para um servidor.

O que eu quero fazer é escrever testes de unidade em JavaScript e, em seguida, fazer com que os testes de unidade produzam JSON, até mesmo texto simples seria adequado.Então eu quero ter uma classe/executável C# genérico que possa carregar o arquivo que contém o JS, executar os testes de unidade JS, descartar/carregar os resultados e retornar uma aprovação/reprovação com detalhes durante uma tarefa pós-construção.

Acho que é possível usar o antigo ActiveX ScriptControl, mas parece que deveria haver uma maneira .NET de fazer isso sem usar o SilverLight, o DLR ou qualquer outra coisa que ainda não tenha sido lançada.Alguém tem alguma ideia?

atualizar: Do 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")]

Esclarecimento:Temos testes de unidade para nossas funções JavaScript que são escritas em JavaScript usando a estrutura JSUnit.Neste momento, durante nosso processo de construção, temos que carregar manualmente uma página da web e clicar em um botão para garantir que todos os testes de unidade JavaScript sejam aprovados.Eu gostaria de poder executar os testes durante o processo de pós-construção quando nossos testes de unidade C# automatizados forem executados e relatar o sucesso/falha junto com nossos testes de unidade C# e usá-los como um indicador se a construção está quebrado.

Foi útil?

Solução

Você pode executar seu JSUnit de dentro do Nant usando o servidor JSUnit, ele está escrito em java e não há uma tarefa Nant, mas você pode executá-lo no prompt de comando, os resultados são registrados como XML e você pode integrá-los ao seu relatório de construção processo.Isso não fará parte do resultado do Nunit, mas de um relatório extra.Falhamos na construção se algum desses testes falhar.Estamos fazendo exatamente isso usando CC.Net.

Outras dicas

O código deve ser bastante autoexplicativo, então vou postá-lo.

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


    }

Você pode usar o mecanismo Microsoft Javascript para avaliando código JavaScript de C#

Atualizar:Isso está obsoleto a partir do VS 2008

Não conheço nenhuma maneira específica do .NET de fazer isso agora ...Bem, ainda existe o JScript.NET, mas provavelmente não será compatível com qualquer JS que você precise executar :)

Obviamente o futuro seria a implementação do .NET JScript para o DLR que está chegando...algum dia (espero).

Então isso provavelmente deixa a execução do antigo mecanismo ActiveX JScript, o que certamente é possível fazer isso no .NET (já fiz isso no passado, embora seja um pouco feio!).

Se você não está executando o código no contexto de um navegador, por que os testes precisam ser escritos em Javascript?É difícil entender o panorama geral do que você está tentando realizar aqui.

Poderia ser mais simples de usar JSUnit para escrever seus testes e, em seguida, usar um WatiNwrapper de teste para executá-los por meio de C#, passando ou falhando com base nos resultados do JSUnit?

Na verdade, é um passo extra.

Acredito ter lido em algum lugar que uma versão futura do MBUnit ou do WatiN terá a funcionalidade integrada para processar acessórios de teste JSUnit.Se eu pudesse lembrar onde li isso...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top