Выполнять 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 пройдены. Я хотел бы иметь возможность выполнять тесты во время процесса после сборки, когда выполняются наши автоматические тесты на модуле С# и сообщают об успехе/неудаче наряду с модульными тестами С# и используют их в качестве индикатора того, будет ли сборка.
Ответы
Ответ 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);
}
}
Ответ 3
Вы можете использовать механизм Microsoft Javascript для для оценки кода JavaScript с С#
Обновление: это устарело, как VS 2008
Ответ 4
Может ли быть проще использовать JSUnit для написания ваших тестов, а затем использовать WatiN
тестовую оболочку для запуска их через С#, передачу или сбой на основе результатов JSUnit?
Это действительно дополнительный шаг.
Я считаю, что где-то я читал, что в будущей версии MBUnit или WatiN будут встроены функциональные возможности для обработки тестовых устройств JSUnit. Если бы я мог вспомнить, где я читал, что...
Ответ 5
Я не знаю какого-либо .NET-специфического способа сделать это прямо сейчас... Ну, там все еще JScript.NET, но это, вероятно, не будет совместимо с любым JS, который вам нужно выполнить:)
Очевидно, что будущее будет реализацией .NET JScript для DLR, которая наступит... когда-нибудь (надеюсь).
Так что, вероятно, это приведет к запуску старого механизма ActiveX JScript, что, безусловно, возможно сделать из .NET(я делал это в прошлом, хотя это немного на уродливой стороне!).
Ответ 6
Если вы не выполняете код в контексте браузера, почему тесты должны быть написаны в Javascript? Трудно понять большую картину того, что вы пытаетесь сделать здесь.