如何模拟依赖关系以返回特定数据?

时间:2018-12-12 13:56:13

标签: javascript unit-testing mocha sinon sinon-chai

来自C#中的Moq,您可以执行以下操作:

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

然后在我打电话时进行单元测试

toBeMocked.MockedMethod()

它返回something。我该如何使用sinonjs?

2 个答案:

答案 0 :(得分:1)

从文档https://sinonjs.org/releases/v7.2.2/stubs/

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

UPDATE:示例jsfiddle

答案 1 :(得分:1)

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();

您需要像这样恢复它,因为不会在测试之间重新创建该原型,因此,存根将污染您的其他测试代码。