Я хотел бы выполнить код 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# и использовать их в качестве индикатора того, была ли сборка сломан.





Вы можете использовать движок Microsoft Javascript для оценка кода JavaScript из C#
Обновление: это устарело с VS 2008
Пространство имен Microsoft.VSA и все его объекты были помечены как устаревшие с VS 2008.
@ScottKoon, @Gulzar: Итак, что нужно сделать вместо использования устаревшего кода?
Может быть проще использовать JSUnit для написания ваших тестов, а затем использовать ВАТИНА тестовая оболочка, чтобы запустить их через C#, пройти или не пройти в зависимости от результатов JSUnit?
Хотя это действительно дополнительный шаг.
Я полагаю, что где-то читал, что в следующей версии MBUnit или WatiN будет встроена функциональность для обработки тестовых приспособлений JSUnit. Если бы я только мог вспомнить, где я это читал ...
Я думал об этом или об использовании Selenium для запуска тестов. Но это все же дополнительный шаг.
Вот пример кода использования WatiN для запуска модульных тестов: adamesterline.com/2007/05/15/…
Я не знаю какого-либо конкретного .NET-способа сделать это прямо сейчас ... Ну, есть еще JScript.NET, но он, вероятно, не будет совместим с любым JS, который вам нужно выполнить :)
Очевидно, будущее будет за реализацией .NET JScript для DLR, которая появится ... когда-нибудь (надеюсь).
Так что, вероятно, останется работать старый движок ActiveX JScript, который, безусловно, можно сделать из .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.VSA было помечено как устаревшее с VS2008 / .NET 3.5 ... если автор знает об этом и нацелен на более раннюю версию, я думаю, это круто. Я должен отметить, что я не проверял их дважды. :)
Если вы не выполняете код в контексте браузера, почему тесты должны быть написаны на Javascript? Трудно понять более широкую картину того, чего вы здесь пытаетесь достичь.
Вы можете запустить свой JSUnit изнутри Nant с помощью сервера JSUnit, он написан на java, и задачи Nant нет, но вы можете запустить ее из командной строки, результаты регистрируются как XML, и вы можете интегрировать их в свой отчет о сборке. процесс. Это не будет частью вашего результата Nunit, а будет дополнительным отчетом. Мы не выполняем сборку, если какой-либо из этих тестов не проходит. Именно это мы и делаем с помощью CC.Net.
Очень жаль, что от реализации Javascript для DLR отказались, я считаю, что это называлось JScriptX, иначе это была бы хорошая чистая интеграция вместе с динамическими функциями C# 4.0.