Модульное тестирование класса ES6 с внешней зависимостью - PullRequest
0 голосов
/ 20 ноября 2018

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

Скажем, зависимость называется productScope, и это объект, который имеет некоторые модели DOM, внутренние API и параметры, а также многие другие вещи, необходимые для каждого проекта.На данный момент Мокко бросает ReferenceError: productScope is not defined. Как я могу издеваться над этим объектом?Или я должен просто использовать реальный объект?

Пример:

class someClass {
    constructor() {
        const id = productScope.items[0].id
        const item = productScope.domModel.querySelector('.some-div')

        item.classList.add(`added-${id}`)
    }
}

Этот код обернут в код ядра, как показано ниже:

(function(productScope) {
    // front end code goes here
}(productScope)

Файл тестирования:

import someClass from '../../js/someClass'

describe('someClass', function() {
    const someClass = new someClass()
    it('should be a class', function() {
        console.log(someClass)
    });
});

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Вы можете попробовать что-то вроде этого

describe('#someClass', () => {
    let someClass;

    beforeEach(() => {
        global.productScope = {
            // mocking productScope object
        };
    });

    it('should be a class', () => {
        someClass = new SomeClass;
        console.log(someClass);
    });

    afterEach(() => {
        delete global.productScope;
    });
});

или, в качестве альтернативы, если вам нужна более конкретная логика макета для каждого теста

describe('#someClass', () => {
    let someClass;

    it('should be a class', () => {
        global.productScope = {
            // mocking productScope object
        };

        // Test logic start

        someClass = new SomeClass;
        console.log(someClass);

        // Test logic end

        delete global.productScope;
    });
});
0 голосов
/ 03 декабря 2018

У меня есть и другие ответы, так как управление global переменными кажется самым простым и простым решением.

Однако вы можете использовать toString , чтобы получить строку классапредставление, и eval , чтобы связать с областью закрытия:

class someClass {
   constructor() {
     this.id = scopedId
   }
}

// pass class as an argument
function scopeFactory(classDef) {

   // define scoped data
   let scopedId = 2;

   // eval is used to bind class to the local closure
   // so `scopedId` will be in charge
   return eval("(" + classDef + ")");
}

const scopedSomeClass = scopeFactory(someClass);

console.log(new scopedSomeClass)

Обратите внимание, что eval(someCLass.toString()) не работает без скобок .

Вы можете добавить его в качестве вспомогательной функции в свойпроект.

0 голосов
/ 21 ноября 2018

Похоже, productScope - глобальная переменная.

Что-то вроде этого должно работать для вас.

import someClass from '../../js/someClass';

describe('someClass', function() {
    let someClass;

    beforeEach(() => {
        global.productScope = {
          // you mock definition
          someClass = new someClass();
        };
    });

    it('should be a class', function() {
        console.log(someClass)
    });
});
...