Как мне смоделировать зависимости, чтобы вернуть конкретные данные?

Исходя из Moq в C#, где вы можете сделать следующее:

someMock
    .Setup(toBeMocked => toBeMocked.MockedMethod(It.IsAny<Something>()))
    .Returns(something);

Затем в модульном тесте, когда я звоню

toBeMocked.MockedMethod()

Возвращается something, Как мне сделать это с sinonjs?

2 ответа

Решение

Sinon работает немного иначе, чем Moq, в основном потому, что C# - это язык, который сильно отличается от JS. Moq создает подклассы для внедрения поддельных методов, в то время как sinon может внедрять их, назначая их непосредственно объектам.

Самая основная модель будет, предполагая, toBeMocked это объект с методом экземпляра MockedMethod:

sinon.stub(toBeMocked, 'MockedMethod').returns(something);

Это назначает метод заглушки MockedMethod собственность toBeMocked объект. Таким образом, он влияет только на этот объект, даже если MockedMethod это метод-прототип.

Если вы хотите заменить метод для всех экземпляров конструктора, вы можете сделать это вместо этого. Если предположить, MockedClass это конструктор, который вы использовали для создания toBeMocked объект, это будет выглядеть так:

sinon.stub(MockedClass.prototype, 'MockedMethod').returns(something);

Тогда позже в вашем коде демонтажа:

MockedClass.prototype.MockedMethod.restore();

Вам необходимо восстановить его следующим образом, поскольку этот прототип не создается заново между тестами, поэтому ваша заглушка будет загрязнять ваш другой тестовый код, если вы этого не сделаете.

Из документации https://sinonjs.org/releases/v7.2.2/stubs/:

const fakeMethod = () => something;
const stub = sinon.stub(toBeMocked , 'MockedMethod');
stub.callsFake(fakeMethod);

ОБНОВЛЕНИЕ: пример jsfiddle

Другие вопросы по тегам