【问题标题】:How do I mock dependencies to return specific data?如何模拟依赖项以返回特定数据?
【发布时间】:2018-12-12 13:56:12
【问题描述】:

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

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

然后在单元测试时我调用

toBeMocked.MockedMethod()

它返回something。我如何用 sinonjs 做到这一点?

【问题讨论】:

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


    【解决方案1】:

    Sinon 的工作方式与 Moq 略有不同,主要是因为 C# 是一种与 JS 大不相同的语言。 Moq 创建子类来注入假方法,而 sinon 能够通过将它们直接分配给对象来注入它们。

    最基本的模式是,假设toBeMocked 是一个具有实例方法MockedMethod 的对象:

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

    这会将存根方法分配给toBeMocked 对象的MockedMethod 属性。因此,它只影响该对象,即使 MockedMethod 是一个原型方法。

    如果你想为构造函数的所有实例替换一个方法,你可以这样做。假设 MockedClass 是您用来创建 toBeMocked 对象的构造函数,它看起来像这样:

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

    然后在您的拆解代码中:

    MockedClass.prototype.MockedMethod.restore();
    

    你需要像这样恢复它,因为原型不是在测试之间重新创建的,所以如果你不这样做,你的存根会污染你的其他测试代码。

    【讨论】:

      【解决方案2】:

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

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

      更新:例如jsfiddle

      【讨论】:

      • 这不是 sinon 的 api 的工作方式。 sinon.stub() 创建一个匿名存根函数。在第三行调用这样的匿名存根不会对 toBeMocked 对象做任何事情。
      • 还有一个简化的 api 用于使存根返回一些东西,因为它是一种常见的操作。看起来像这样:sinon.stub(toBeMocked, 'MockedMethod').returns(something);
      • 我的错,参数应该已经传递给构造函数。但是这个解决方案有效并且可以满足 OP 的要求。检查更新答案中的示例小提琴
      • callsFake() 方法的 +1,但是如果目标只是返回特定的东西,@sripberger 解决方案会更干净。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 2018-01-05
      • 2015-08-25
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      相关资源
      最近更新 更多