2008-09-15 3 views
20

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

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

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

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

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

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

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

обновление: From Brad Abrams blog

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

+0

Это такой позор, что реализация Javascript для DLR была оставлена, я считаю, что она называлась JScriptX, или это была бы хорошая чистая интеграция наряду с динамическими функциями C# 4.0. – 2010-09-12 05:41:53

ответ

1

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

2

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

Update: Это устаревшее по состоянию на VS 2008

+2

Пространство имен Microsoft.VSA и все его объекты были отмечены как устаревшие, как VS 2008. – ScottKoon 2008-09-15 23:00:44

+0

ОК, я останусь здесь. опубликует обновление. – 2008-09-15 23:04:54

+2

@ScottKoon, @Gulzar: Итак, что нужно делать вместо использования устаревшего кода? – 2011-05-18 09:20:11

0

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

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

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

0

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

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

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

7

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

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


    } 
0

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

Смежные вопросы