2017-02-21 48 views
0

Так что я использую TypScript/RequireJs/Jasmine и не могу заставить своего шпиона работать для модулей, загружаемых в другой модуль.Как использовать Жасмин для шпиона на модулях, загружаемых requireJS?

Вот мой Spec:

import { CrmWebApiLib }  from "../../../webresources/allgnt_/scripts/Allgnt.RestLib"; 
import { TextFormatter } from "../../../webresources/new_/scripts/script/TextFormatter"; 

describe("Test",() => { 
    it("A Test",() => { 
     spyOn(CrmWebApiLib, "create").and.callFake((a, b) => { }); 

     TextFormatter.test(); 

     expect(CrmWebApiLib.create).toHaveBeenCalled(); 
    }); 

    it("B Test",() => { 
     var stub = { 
      CrmWebApiLib: { 
       create(a, b) { } 
      } 
     }; 
     define("../../../webresources/allgnt_/scripts/Allgnt.RestLib", [], stub as any); 
     spyOn(stub.CrmWebApiLib, "create").and.callFake((a, b) => { }); 

     TextFormatter.test(); 

     expect(CrmWebApiLib.create).toHaveBeenCalled(); 
    }); 
}); 

Вот TextFormatter:

import { RestLib, CrmWebApiLib } from "../../../allgnt_/scripts/allgnt.restlib"; 

export module TextFormatter { 
    export function test() { 
     CrmWebApiLib.create("A", "Test"); 
    } 
} 

В любом "Тестовый" или "B Test" Я не могу получить шпиона функционировать. Он всегда вызывает фактическую реализацию и ошибки. Я могу изменить TextFormatter, чтобы можно было вставлять определение TextFormatter, но это просто неправильно.

Как получить вызов spyOn для работы в таких ситуациях?

ответ

0

Выясните ответ, используйте Squire.js.

it("A Test", (done) => { 
    const injector = new Squire(); 
    var mock = { CrmWebApiLib: { create:() => { } }}; 

    spyOn(mock.CrmWebApiLib, "create").and.callFake((a, b) => { }); 
    injector 
     .mock("allgnt_/scripts/allgnt.restlib", mock) 
     .require(["new_/scripts/script/Dfnd.TextFormatter"], (mod) => { 
      mod.TextFormatter.test(); 
      expect(mock.CrmWebApiLib.create).toHaveBeenCalled(); 
      done(); 
     }); 

}); 

только два икоту:

  1. Installed Squire, а не Squirejs,
  2. Это does not support relative paths.
+0

Вы имеете в виду Squire. Я не рекомендую его для более простых проектов. Это нарушает основные аксиомы RequireJS. Наиболее проблематичным является то, что модули перестают быть синглонами при использовании с Squire. Признаки, которые могут возникнуть, могут быть очень трудно отследить до их основной причины. Это возможно *, чтобы обойти это, но для более чем супер простого проекта это может потребовать * большого количества шаблонов *, чтобы получить издеваемую среду в хорошем состоянии. (См. [Этот вопрос] (https://github.com/iammerrick/Squire.js/issues/39) для примера.) – Louis

+0

@Louis, Да, я действительно имел в виду Squire, исправленный. Если сквайр не является решением, чем то, что есть? – Daryl

+0

Нет решения «одного размера для всех». В некоторых проектах мне удалось решить проблему, загрузив тестируемый код в 'iframe'. Это позволило мне возиться с конфигурацией RequireJS перед запуском теста. (JSDom в узле также разрешает то же самое без браузера.) Это имело смысл * для этих проектов *, но не является общим решением. Иногда я переработал код, чтобы упростить тестирование. 'TextFormatter' может быть классом, который имеет метод' test'. Конструктор 'TextFormatter' может принимать параметр, который предоставляет объект, на который вызывается' .create'. – Louis

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

  • Нет связанных вопросов^_^