2008-09-15 15 views
20

Chciałbym wykonać kod JavaScript z poziomu złożenia C# i uzyskać wyniki kodu JavaScript zwrócone do wywołującego kodu C#.Wykonywanie kodu JavaScript z poziomu zestawu C#

Łatwiej określić rzeczy, które nie próbuję zrobić:

  • Nie próbuję wywołać funkcję JavaScript na stronie WWW z mojego kodu tyłu.

  • Nie próbuję załadować formantu WebBrowser.

  • Nie chcę, aby JavaScript wykonywał wywołanie AJAX na serwerze.

Co chcę zrobić, to napisać testy jednostkowe w JavaScript, a następnie testy jednostkowe wyjść JSON, nawet zwykły tekst byłby w porządku. Następnie chcę mieć ogólną klasę C#/executible, która może załadować plik zawierający JS, uruchomić testy jednostki JS, złomowanie/załadowanie wyników i zwrócenie pass/fail ze szczegółami podczas zadania po kompilacji.

Myślę, że jest to możliwe przy użyciu starego ActiveX ScriptControl, ale wydaje się, że powinien być sposób .NET, aby to zrobić bez użycia SilverLight, DLR, ani niczego, co jeszcze nie zostało wysłane. Ktoś ma jakieś pomysły?

zmiana: 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")] 

Wyjaśnienie: Mamy testy jednostkowe dla naszych funkcji JavaScript, które są napisane w JavaScript z wykorzystaniem ramy JSUnit. W tej chwili w trakcie procesu budowania musimy ręcznie załadować stronę internetową i kliknąć przycisk, aby upewnić się, że wszystkie testy jednostkowe JavaScript przechodzą pomyślnie. Chciałbym móc wykonać testy w trakcie procesu późniejszego po uruchomieniu naszych automatycznych testów C# i zgłaszać sukces/niepowodzenie wraz z testami jednostkowymi C# i używać ich jako wskaźnika określającego, czy kompilacja Jest zepsuty.

+0

Szkoda, że ​​implementacja Javascript dla DLR została porzucona, uważam, że nazywała się JScriptX, lub byłaby to czysta czysta integracja wraz z dynamicznymi funkcjami C# 4.0. –

Odpowiedz

1

Możesz uruchomić swój JSUnit z wnętrza Nant używając serwera JSUnit, jest napisany w Javie i nie ma zadania Nant, ale możesz uruchomić go z poziomu wiersza poleceń, wyniki są logowane jako XML i możesz je zintegrować z procesem tworzenia raportu. To nie będzie częścią twojego wyniku Nunit, ale dodatkowym raportem. Nie powiedzie się kompilacja, jeśli którykolwiek z tych testów nie powiedzie się. Robimy dokładnie to za pomocą CC.Net.

2

można wykorzystywać silnik Microsoft Javascript dla evaluating JavaScript code from C#

Aktualizacja: To jest przestarzały jak VS 2008

+2

Przestrzeń nazw Microsoft.VSA i wszystkie jej obiekty zostały oznaczone jako Przestarzałe od wersji VS 2008. – ScottKoon

+0

OK, zostawiam wpis tutaj. opublikuje aktualizację. –

+2

@ScottKoon, @Gulzar: Co należy zrobić zamiast używać przestarzałego kodu? –

0

Może to być prostsze w użyciu JSUnit do pisania testów, a następnie użyć otoki WatiN testową uruchomić je przez C#, przekazywanie lub niepowodzenie na podstawie wyników JSUnit?

To rzeczywiście dodatkowy krok.

Wierzę, że czytałem gdzieś, że nadchodząca wersja MBUnit lub WatiN będzie miała wbudowaną funkcjonalność do przetwarzania testów testowych JSUnit. Gdybym tylko pamiętał, gdzie to czytam ...

+0

Myślałem o tym lub używając Selenium do uruchomienia testów. Ale to wciąż dodatkowy krok. – ScottKoon

+0

Istnieje przykładowy kod dotyczący używania WatiN do uruchamiania testów jednostkowych tutaj: http://adamesterline.com/2007/05/15/integrating-jsunit-with-nunit-using-watin/ –

0

Nie znam żadnego konkretnego sposobu .NET w tej chwili ... Cóż, wciąż jest JScript.NET, ale to prawdopodobnie nie będzie kompatybilny z każdym JS, który musisz wykonać :)

Oczywiście przyszłością byłaby implementacja .NET JScript dla DLR, która nadchodzi ... pewnego dnia (mam nadzieję).

Tak więc prawdopodobnie pozostawia uruchomiony stary silnik ActiveX JScript, co jest oczywiście możliwe do zrobienia z .NET (zrobiłem to w przeszłości, choć jest trochę po stronie brzydkiej!).

7

Kod powinien być całkiem objaśniający, więc po prostu to opiszę.

<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

Myślę, że ktoś inny już wskazał że przestrzeń nazw Microsoft.VSA została oznaczona jako przestarzała od wersji VS2008/.NET 3.5 ... dopóki autor jest tego świadomy i kieruje się do wcześniejszej wersji, myślę, że jest fajna. Powinienem jednak zaznaczyć, że nie sprawdziłem ich dwukrotnie. :) –

0

Jeśli nie wykonanie kodu w kontekście przeglądarki, dlaczego testy muszą być napisane w JavaScript? Trudno zrozumieć większy obraz tego, co próbujesz osiągnąć tutaj.

Powiązane problemy