Как проверить вызов JavaScript с правильными аргументами в GWT?

Я создал тонкую оболочку GWT вокруг существующего API JavaScript. JavaScript API тестируется независимо, поэтому все, что я хочу сделать, — это проверить, вызывает ли оболочка GWT правильные функции JavaScript с правильными аргументами. Любые идеи о том, как это сделать?

В настоящее время GWT API имеет множество общедоступных методов, которые после небольшой обработки вызывают частные нативные методы, которые вызывают вызовы JavaScript API.

Любое руководство приветствуется, спасибо.


person Supertux    schedule 21.09.2009    source источник


Ответы (2)


В мире Java то, что вы просили, обычно делается с помощью делегирования и интерфейсов.

Я бы сделал (java) интерфейс, который один в один соответствует API библиотеки js, а затем создал простую реализацию этого интерфейса.

Вместо этого ваш код-оболочка обертывает интерфейс. Во время тестирования вы заменяете реализацию этого интерфейса своей собственной, где каждый метод просто утверждает, вызывается он или нет.

E.g.

custom.lib.js has these exported methods/objects:
var exports = { 
   method1: function(i) {...}, 
   method2: function() {...},
   ...etc
}

your custom interface:
public interface CustomLib {
   String method1(int i);
   void method2();
   //...etc etc
}

your simple impl of CustomLib:
public class CustomLibImpl implements CustomLib {
   public CustomLibImpl() {
      initJS();
   }
   private native void initJS()/*-{ 
      //...init the custom lib here, e.g.
      $wnd.YOUR_NAME_SPACE.customlib = CUSTOMLIB.newObject("blah", 123, "fake");
   }-*/;
   public native String method1(int i)/*-{
      return $wnd.YOUR_NAME_SPACE.customlib.method1(i);
   }-*/;
   void method2()/*-{
      $wnd.YOUR_NAME_SPACE.customlib.method2();
   }-*/;
   //...etc etc
}

then in your Wrapper class:
public class Wrapper {
   private CustomLib customLib;
   public Wrapper(CustomLib  customLib ) {
      this.customLib = customLib;
   }

   public String yourAPIMethod1(int i) {
      return customLib.method1(i);
   }
   ///etc for method2()
}


your test:
public class YourCustomWrapperTest {
   Wrapper wrapper;
   public void setup() {
      wrapper = new Wrapper(new CustomLib() {
         //a new impl that just do asserts, no jsni, no logic.
         public String method1(int i) {assertCalledWith(i);}
         public void method2() {assertNeverCalledTwice();}
         //etc with other methods
      });
   }
   public void testSomething() { wrapper.yourAPIMethod1(1);}
}
person Chii    schedule 21.09.2009

Лучший способ определить, сработала ли функция, — заставить функцию писать в замыкание, а затем проверять значение замыкания. Поскольку замыкание является переменной, вы можете определить его как аргумент функции, но это определение должно происходить в родительской функции.

person Community    schedule 21.09.2009