Как мне смоделировать зависимости, чтобы вернуть конкретные данные?
Исходя из 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