Как избежать состояния гонки в тестах Жасмин при использовании статических членов? - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть тесты Жасмин, которые проводятся с кармой. Эти тесты охватывают объект со статическими свойствами, которые используются для управления поведением. Изменение этих статических свойств имеет отрицательные последствия для тестов, которые не ожидают, что они будут отклоняться от значений по умолчанию Конкретнее, этот тест:

it('honors the base64CharactersPerLine option', () => {
    const testData = new Uint8Array([ 0x01, 0x02, 0x03, 0x04 ]);
    const pem = new PEMObject();
    pem.header = "CERTIFICATE";
    pem.data = testData;
    PEMObject.base64CharactersPerLine = 1; // Causes race condition
    const encodedData = pem.encode();
    console.info(encodedData);
    console.info(encodedData.match(/^\w/g));
    expect(encodedData.match(/^\w$/g).length).toBeGreaterThan(testData.length);
});

отрицательно влияет на этот тест:

it('decoding then encoding returns the original data', () => {
    const pem = new PEMObject();
    pem.header = "CERTIFICATE";
    pem.decode(testPEM);
    expect(pem.encode()).toEqual(testPEM);
});

, сделав вывод pem.encode() в последнем тесте не идентичным исходному вводу testPEM (a string).

Более общий вопрос, который я хотел бы знать: как вы предотвращаете условия гонки в тестах кармы / жасмина, где статические члены используются для изменения поведения?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

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

Есть два способа это исправить. Сначала в блоке beforeEach кэшируйте исходное значение статического свойства, а затем сбросьте его в блоке afterEach. Как это:

let cachedValue;
beforeEach(() => cachedValue = PEMObject.base64CharactersPerLine);
afterEach(() => PEMObject.base64CharactersPerLine = cachedValue);

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

Лучший подход состоит в том, чтобы перейти от использования статических свойств и использовать вместо этого статические методы (хотя это требует изменения вашего базового кода). После использования статических методов вы можете использовать жасминовые шпионы, которые очищаются после каждого запуска теста. Итак, вы бы сделали что-то вроде этого:

// in your base code
PEMObject.getBase64CharactersPerLine = () => SOME_VALUE;

// in your 'honors the base64CharactersPerLine option' test
spyOn(PEMObject, 'getBase64CharactersPerLine').and.returnValue(1);

И вам больше не нужны beforeEach / afterEach блоки.

0 голосов
/ 01 сентября 2018

Вы уверены, что это условие гонки, а не просто проблема, при которой вы модифицируете объект, который используют многие тесты?

Возможно, вы можете сохранить старое значение поля base64CharactersPerLine до запуска теста и восстановить его после этого, чтобы другие тесты увидели значение right .

...