2016-03-01 2 views
8

Мне интересно, как я могу использовать функцию spy/stub на Jasmine, если я использую импорт/экспорт ES6 с babel?Жасмин: Как шпион импортировать функцию/конструктор на ES6?

import MobileDetect from 'mobile-detect'; 
it('should spy MobileDetect',() => { 
    MobileDetect = jasmine.createSpy('MobileDetect'); 
});` 

Первая проблема заключается в том, что я не могу переписать модуль только для чтения

Модуль сборки не удалось: SyntaxError: /Users/oleg/projects/rp/popup/lib/spec/popup.spec.js: "MobileDetect" is read-only

it('should spy MobileDetect',() => { 
    console.log(MobileDetect.prototype.constructor === MobileDetect); //true 
    spyOn(MobileDetect.prototype, 'constructor'); 
    console.log(MobileDetect.prototype.constructor === MobileDetect); //false 
});` 

Я попробовал этот подход, но он не работает слишком. .. MobileDetect.prototype.constructor spied, но MobileDetect напрямую нет.

Что вы думаете об этой проблеме?

+0

Вы не можете следить за «MobileDetect», потому что значение переменной не может быть переписано новой функцией шпионажа. Мое предположение: что, если вы делали «var myMobileDetect = MobileDetect», а затем вместо этого наводили «myMobileDetect»? Очевидно, вам нужно будет изменить свой код, чтобы использовать 'myMobileDetect'. – apsillers

+1

Мне интересно, что вы пытаетесь выполнить в своем тесте. Вы хотите создать шпиона, который имитирует методы «MobileDetect»? (т.е. макет) –

ответ

1

Как и в случае с proxyquire для издевательских заявлений require(), вы можете использовать babel-plugin-rewire, чтобы сделать то же самое с импортом ES6.

Ваша тестовая установка может выглядеть примерно так:

import myModuleUnderTest from '../src/popup'; 

beforeEach(() => { 
    this.fakeMobileDetect = jasmine.createSpy(); 
    myModuleUnderTest.__Rewire__('MobileDetect', this.fakeMobileDetect); 
}); 

С какими вы можете вернуться в нормальное состояние;

afterEach(() => { 
    myModuleUnderTest.__ResetDependency__('MobileDetect'); 
});