Подтвердить что ты не робот

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

Я хотел бы выполнить код JavaScript из сборки С# и получить результаты кода JavaScript, возвращаемого вызывающему С# -коду.

Легче определить, что я не пытаюсь сделать:

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

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

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

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

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

update: Из блога 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")]

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

4b9b3361

Ответ 1

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

Ответ 2

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

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


    }

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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