Как заглушить один и тот же метод в двух тестах, используя Sinon? - PullRequest
0 голосов
/ 27 февраля 2019

Я использую Node, Mongoose, Sinon, Mocha.

На уровне DAO у меня есть методы с именем methodA, methodB.На уровне обслуживания у меня есть servMethodA (вызывает метод A), servMethodB (вызывает метод B), servMethodC.Теперь servMethodC вызывает метод A из DAO, а затем у меня есть вызов метода B, вложенный в него.

В тестовых примерах для сервисного уровня я уже обозначил метод A и methodB.Как мне снова заглушить их для контрольного примера для servMethodC?

Это мои методы обслуживания.

function findLikeByPostIdAndUserId(postId, userId) {
        return new Promises((resolve, reject) => {
            likeDislikeDao.findLikeByPostIdAndUserId(postId, userId).
                then((data) => {
                    resolve(data);
                })
                .catch((error) => {
                    reject(error);
                });
        });
    }

function findDislikeByPostIdAndUserId(postId, userId) {
    return new Promises((resolve, reject) => {
        likeDislikeDao.findDislikeByPostIdAndUserId(postId, userId).
            then((data) => {
                resolve(data);
            })
            .catch((error) => {
                reject(error);
            });
    });
}

function saveLike(like) {
    console.log(like);
    return new Promises((resolve, reject) => {
        console.log(data);
        likeDislikeDao.findLikeByPostIdAndUserId(like.postId, like.userId).
            then((data) => {

                if (!data) {
                    likeDislikeDao.findDislikeByPostIdAndUserId(like.postId, like.userId).
                        then((dislikeData) => {
                            if (!dislikeData) {
                                likeDislikeDao.saveLike(like).
                                    then((data) => {
                                        resolve(data);
                                    });
                            }
                            else {
                                likeDislikeDao.deleteDislike(dislikeData._id)
                                    .then((data) => {
                                        likeDislikeDao.saveLike(like).
                                            then((data) => {
                                                resolve(data);
                                            });
                                    });
                            }
                        });
                }
                else {
                    likeDislikeDao.deleteLike(data._id)
                        .then((data) => {
                            //likeDislikeDao.saveLike(like).
                            //  then((data) => {
                            //     resolve(data);
                            // });
                            resolve(data);
                        });
                }
            })
            .catch((error) => {
                reject(error);
            });;
    });
}

Вот мои отдельные контрольные примеры.

    describe('saveLike', function () {
    it('should add a like', function () {
        var stub = sinontwo.stub(likeDislikeDao, 'saveLike');
        stub.withArgs(newLike).callsFake(() => {
            return Promise.resolve(newLike);
        });
        var stubtwo = sinontwo.stub(likeDislikeDao, 'saveDislike');
        stubtwo.withArgs(newDislike).callsFake(() => {
            return Promise.resolve(newDislike);
        });
        const stubthree = sinontwo.stub(likeDislikeDao, 'findLikeByPostIdAndUserId');
        stubthree.callsFake(() => {
            return Promise.resolve(like);
        });
        const stubfour = sinontwo.stub(likeDislikeDao, 'findDislikeByPostIdAndUserId');
        stubfour.callsFake(() => {
            return Promise.resolve(dislike);
        });
        likeDislikeService.saveLike(newLike).then(response => {
            console.log('1 -> ');
            console.log(response);
            assert.length(response, 1);
        });
        stub.withArgs(like).callsFake(() => {
            return Promise.reject('');
        });
        stubtwo.withArgs(dislike).callsFake(() => {
            return Promise.reject('');
        });
        likeDislikeService.saveLike(like).then(response => {
            console.log('2 -> ');
            console.log(response);
            assert.lengthOf(response, 1);
        }).then((err) => {
            console.log(err);
            assert.isDefined(err);
        });
    });
});

describe('findLikeByPostIdAndUserId()', function () {
    it('should find likes by post id and user id', function () {

        likeDislikeService.findLikeByPostIdAndUserId(1,2).then(response => {
            assert.length(response, 1);
        });
        likeDislikeService.findLikeByPostIdAndUserId(1,2).then(response => {
            assert.length(response, 1);
        }).catch((err) => {
            //console.log(err);
            assert.isDefined(err);
        });
    })
});

describe('findDislikeByPostIdAndUserId()', function () {
    it('should find dislikes by post id and user id', function () {

        likeDislikeService.findDislikeByPostIdAndUserId(1,2).then(response => {
            assert.length(response, 1);
        });

        likeDislikeService.findDislikeByPostIdAndUserId(1,2).then(response => {
            assert.length(response, 1);
        }).catch((err) => {
            console.log(err);
            assert.isDefined(err);
        });
    })
});

Проблема в том, что я не получаю «отвергающую» часть методов find в покрытии.Кроме того, метод saveLike не рассматривается должным образом, кроме строк «then».

...