存根/模拟进程平台Sinon

7

我正在使用 process.platform ,并且希望伪造该字符串值以模拟不同的操作系统。

(这个对象是在我无法更改的情况下生成的,我需要测试它可以采用的不同值)

是否可能伪造/仿造这个值?

我已经尝试过以下方法,但没有成功:

stub = sinon.stub(process, "platform").returns("something")

我遇到了错误 TypeError: Attempted to wrap string property platform as function

如果我尝试使用以下模拟,也会出现相同的错误:

mock = sinon.mock(process);
mock.expects("platform").returns("something");

如果我理解得不对,请大家纠正我。通常,我使用存根来创建虚拟的函数/方法,这些函数/方法被测试中的函数/方法使用,以创建一个可预测的场景。我从未测试过存根方法的返回值,因为(假设我强制存根方法返回一个值),我已经知道该值是什么了。把一个值赋给对象属性,然后再去测试它,这甚至更没有意义。也许我误解了你的问题。如果是这样,请详细说明一下。 - JME
也许这里的上下文太少了。我的工作是制作一个跨平台的npm模块,必须在不同的操作系统上有不同的行为,因此我必须模拟/伪造我所在的操作系统。我必须存根process.platform,我相信我不能通过简单地覆盖它来改变它。 - Automatico
当然可以。我会将它发布为我的回答。 - JME
1
@Cort3z,你的示例代码应该引用process.platform而不是global.generated_object。请始终显示真实的代码。 - Mulan
@naomik:现在已经更新了问题 :) 感谢您的反馈。 - Automatico
2个回答

11

你不需要 Sinon 来完成你所需的操作。虽然 process.platform 进程不可写,但是它是可配置的。因此,你可以临时重新定义它,在测试完成后简单地恢复它。

这是我会这样做:

var assert = require('assert');

describe('changing process.platform', function() {
  before(function() {
    // save original process.platform
    this.originalPlatform = Object.getOwnPropertyDescriptor(process, 'platform');

    // redefine process.platform
    Object.defineProperty(process, 'platform', {
      value: 'any-platform'
    });
  });

  after(function() {
    // restore original process.platfork
    Object.defineProperty(process, 'platform', this.originalPlatform);
  });

  it('should have any-platform', function() {
    assert.equal(process.platform, 'any-platform');
  });
});

3
sinon的存根支持"值"函数,用于现在设置存根的新值:
sinon.stub(process, 'platform').value('ANOTHER_OS');
...
sinon.restore() // when you finish the mocking

请查看https://sinonjs.org/releases/latest/stubs/获取详细信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接