Выполнить JavaScript из сборки C # - PullRequest
20 голосов
/ 16 сентября 2008

Я хотел бы выполнить код 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 ]

7 голосов
/ 16 сентября 2008

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

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


    }
2 голосов
/ 16 сентября 2008

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

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

1 голос
/ 16 сентября 2008

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

0 голосов
/ 16 сентября 2008

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

0 голосов
/ 16 сентября 2008

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

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

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

0 голосов
/ 16 сентября 2008

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

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

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

...