Как смоделировать метод, который не принимает аргументов и должен нормально работать в 1 тесте, и должен выдать ошибку в другом тесте - PullRequest
0 голосов
/ 27 апреля 2019

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

Я использую Nodejs, Typescript, Mocha, Chai, nyc и mock-require для насмешек.

Это проект AWS, поэтому я работаю с методами AWS

Вот функция и метод, я издеваюсь, описываюAutoScalingGroups ()

    export async function suspendASGroups() {
    const autoscaling = new AWS.AutoScaling();

    const asgGroups = await autoscaling.describeAutoScalingGroups().promise();

    if (!asgGroups.AutoScalingGroups) {
        throw new Error("describeAutoScalingGroups inside of suspendAGSGroups didn't return any groups");
    }
    // some other stuff below

Это ТЕСТ, которыйдолжен потерпеть неудачу (выше этого есть тест той же функции, которая будет возвращать обычные значения)

it('Should throw an error, should fail', async () => {

        assertNative.rejects(awsFunctions.resumeAGSGroups());


        try {
            let result = await awsFunctions.suspendASGroups();
        } catch (e) {
            assert.isTrue(
                e.name == 'Error' &&
                    e.message == "describeAutoScalingGroups inside of suspendAGSGroups didn't return any groups",
                'describeAutoScalingGroups in suspendAGSGroups didnt have the proper error message'
            );
        }
    });

А вот макет кода

public describeAutoScalingGroups() {
        const data = (): AWS.AutoScaling.Types.AutoScalingGroupsType => {


            return {
                // some values here
        };

        return {
            promise: data
        };
    }

Я ожидаю, что смогучтобы пройти оба теста, тот, который ожидает обычное значение, и тот, который ожидает, что он выдаст ошибку

, вот изображение покрытия: https://i.imgur.com/D6GX0tf.png

Я ожидаю, что красная часть куйти:)

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 апреля 2019

Мне дали ответ на Reddit, поэтому я также опубликую его здесь:

Вам нужны разные макеты для каждого теста.Вы должны настроить свои макеты в хуках before / beforeEach, которые вы получите от mocha https://mochajs.org/#hooks.

Использование sinon сделает чистое создание макетов чище, но если вы застряли с mock-require, то похоже, что вам нужно будетиспользуйте https://www.npmjs.com/package/mock-require#mockrerequirepath --- конец комментария

Как я это сделал:

Я создал еще один макетный файл, который совпадает с обычным макетным файлом, кроме этогосбой функции (что хорошо) Вот код в ТЕСТ:

describe('Testing FAILING suspendAGSGroups', () => {
    it('Should throw an error, should fail', async () => {

        const mock = require('mock-require');
        mock.stopAll();

        let test = require('./test/mocks/indexFailMocks');

        mock.reRequire('./test/mocks/indexFailMocks');

        let awsFailing = mock.reRequire('./handler');
        // the line above is pretty important, without it It wouldnt have worked, you need to reRequire something even if it's the code of it isn't changed(I only changed the MOCK file but I had to reRequire my main function)

        try {
            let result = await awsFailing.suspendASGroups();
        } catch (e) {

            assert.isTrue(
                e.name == 'Error' &&
                    e.message == "describeAutoScalingGroups inside of 
suspendAGSGroups didn't return any groups",
                'describeAutoScalingGroups in suspendAGSGroups didnt have the proper 
error message'
            );
        }
    });
});
0 голосов
/ 27 апреля 2019

В вашем макете вам нужно вернуть что-то для AutoScalingGroupsType, которое оценивается как ложное, так как у вас есть эта проверка:

if (!asgGroups.AutoScalingGroups) { ... }

Так что вы можете просто сделать это:

public describeAutoScalingGroups() { 
    return {
        promise: () => {
            return { AutoScalingGroups: false }
        }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...