Выполнить JavaScript из сборки C#

Я хотел бы выполнить код JavaScript из сборки C# и вернуть результаты кода JavaScript в вызывающий код C#.

Проще определить вещи, которые я не пытаюсь сделать:

  • Я не пытаюсь вызвать функцию JavaScript на веб-странице из моего кода.

  • Я не пытаюсь загрузить элемент управления WebBrowser.

  • Я не хочу, чтобы JavaScript выполнял AJAX-вызов на сервере.

То, что я хочу сделать, это написать модульные тесты в JavaScript и затем вывести модульные тесты в формате JSON, даже простой текст будет в порядке. Затем я хочу иметь общий класс / исполняемый файл C#, который может загружать файл, содержащий JS, запускать модульные тесты JS, отбирать / загружать результаты и возвращать данные прохождения / неудачи с деталями во время задачи после сборки.

Я думаю, что возможно использовать старый ActiveX ScriptControl, но, похоже, должен быть способ.NET для этого без использования SilverLight, DLR или чего-либо еще, что еще не было отправлено. У кого-нибудь есть идеи?

обновление: из блога Брэда Абрамса

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")]

Пояснение: у нас есть модульные тесты для наших функций JavaScript, которые написаны на JavaScript с использованием инфраструктуры JSUnit. Прямо сейчас во время процесса сборки нам нужно вручную загрузить веб-страницу и нажать кнопку, чтобы убедиться, что все модульные тесты JavaScript пройдены. Я хотел бы иметь возможность выполнять тесты во время процесса после сборки, когда наши автоматизированные модульные тесты C# запускаются, и сообщать об успехе / неудаче наряду с нашими модульными тестами C# и использовать их в качестве индикатора того, стоит ли сборка сломано.

6 ответов

Решение

Вы можете запустить свой JSUnit изнутри Nant с помощью сервера JSUnit, он написан на java и нет задачи Nant, но вы можете запустить его из командной строки, результаты записываются как XML, и вы можете интегрировать их с вашим отчетом о сборке. процесс. Это будет не часть вашего результата Nunit, а дополнительный отчет. Мы проваливаем сборку, если любой из этих тестов не пройден. Мы делаем именно это с помощью CC.Net.

Код должен быть достаточно понятным, поэтому я просто опубликую его.

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


    }

Вы можете использовать движок Microsoft Javascript для оценки кода JavaScript из C#

Обновление: Это устарело с VS 2008

Если вы не выполняете код в контексте браузера, почему тесты должны быть написаны на Javascript? Трудно понять общую картину того, что вы пытаетесь достичь здесь.

Я не знаю ни одного конкретного способа.NET сделать это прямо сейчас... Ну, есть еще JScript.NET, но это, вероятно, не будет совместимо с тем JS, который вам нужно выполнить:)

Очевидно, что будущее будет за реализацией.NET JScript для DLR, которая появится... когда-нибудь (надеюсь).

Так что это, вероятно, оставляет работу старого движка ActiveX JScript, что, безусловно, возможно сделать из.NET (я делал это в прошлом, хотя это немного уродливо!).

Может быть проще использовать JSUnit для написания ваших тестов, а затем использовать оболочку для тестов WatiN для запуска их через C#, проходя или не проводя тест на основе результатов JSUnit?

Это действительно дополнительный шаг, хотя.

Я полагаю, что где-то читал, что в будущей версии MBUnit или WatiN будет встроена функциональность для обработки тестовых приборов JSUnit. Если бы я только мог вспомнить, где я это читал...

Другие вопросы по тегам