С Sinon, как я могу издеваться над http.foo.get, когда http является свойством? - PullRequest
2 голосов
/ 08 июня 2019

У меня есть файл, который я хочу проверить, с http-client, который должен быть смоделирован:

schema.js:

const { http } = require('@foo/http-client');
.......
const result = await http.foo('another-service').get('graphql', {
                query: `
    {
        SomeResolver(clientId: "${args.clientId}") {
            id
            start
            end
        }
    }
    `,
});

Мне нужно смоделировать result.

schema.test.js:

const sinon = require('sinon');
const mockHttp = sinon.mock(require('@foo/http-client'));
.........
mockHttp.expects('foo').returns({
    get: (x,y) => {
        // mock the response here
    },
});

TypeError: Attempted to wrap undefined property foo as function - ошибка с вышеприведенным, которая имеет смысл, поскольку http равно destructured.

Однако, если яизмените строку expects на:

mockHttp.expects('http').returns

Я получаю ошибку TypeError: Attempted to wrap object property http as function, что также имеет смысл, потому что http является property.

Как вы можете видеть, я 'Я совершенно новичок в Sinon, но мой вопрос в том, как я могу высмеивать http.foo.get, когда http является property?

1 Ответ

1 голос
/ 08 июня 2019

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

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

const { http } = require('@foo/http-client');
const mockHttp = sinon.mock(require('@foo/http-client').http); // mind .http
mockHttp.expects('foo').returns({
    get: (x,y) => {
        // mock the response here
    },
});
http.foo().get();
mockHttp.verify();

Если вам нужно установить ожидания для других http функций, вы можете повторно использовать mockHttp. Если вам нужны ожидания для функций где-то еще в модуле, вам нужно создать еще один макет для объекта, в котором они объявлены, и verify() этот другой макет. (В любом случае, я так понимаю, кто-то, пожалуйста, исправьте, если вы знаете лучше!)

В любом случае использование назначений деструктурирования не изменит того факта, что ваша http переменная ссылается на свойство http модуля. Другими словами:

const { http } = require('@foo/http-client');
console.log( http === require('@foo/http-client').http ); // true
...