Javascript 返回先前测试用例模拟值的Sinon存根

Javascript 返回先前测试用例模拟值的Sinon存根,javascript,typescript,unit-testing,sinon,Javascript,Typescript,Unit Testing,Sinon,我遇到了一个让我发疯的问题 我试图从我实现的方法中测试一个函数,该方法基于一些中间函数的返回应该有两种不同的结果。因此,我使用sinon模拟中间函数返回值(实际上它会调用API),但问题是,对于第一个测试,模拟结果是正确的,但在第二个测试中,结果与我在第一个测试中指定的结果相同,而不是我尝试执行的新模拟 我将在一段时间后恢复模拟,但它仍然不起作用 我的代码如下: import * as exportedFuncs from './src/utilFuncs'; import assert fr

我遇到了一个让我发疯的问题

我试图从我实现的方法中测试一个函数,该方法基于一些中间函数的返回应该有两种不同的结果。因此,我使用sinon模拟中间函数返回值(实际上它会调用API),但问题是,对于第一个测试,模拟结果是正确的,但在第二个测试中,结果与我在第一个测试中指定的结果相同,而不是我尝试执行的新模拟

我将在一段时间后恢复模拟,但它仍然不起作用

我的代码如下:

import * as exportedFuncs from './src/utilFuncs';

import assert from 'assert';
import sinon from 'sinon';

describe('Utils', () => {
  let mock: any;
  beforeEach(function() {
    mock = sinon.stub(exportedFuncs, 'setDefault');
  });

  afterEach(function() {
    mock.restore();
  });

  it('Func should return a default prop', async () => {
    const mockedRequest = {
      hostname: 'www.example.com'
    };
    const ctx = { req: mockedRequest, userName: 'test', password: 'someLongPass12345$$' };

    mock.returns(
      Promise.resolve({
          code: 'test'
        })
    );
    
    const result = await exportedFuncs.buildInfo(ctx);

    let code = result?.defaultValue?.code;

    assert('defaultValue' in result);
    assert.strictEqual(code, 'test');
  });

  it('Func should return a redirectUrl', async () => {
    const mockedRequest = {
      hostname: 'www.example.com'
    };

    const ctx = { req: mockedRequest, userName: 'test', password: 'someLongPass12345$$' };

    mock.returns(Promise.resolve(null));

    sinon.stub(exportedFuncs, 'getRedirect').returns(
      Promise.resolve({
         toUrl: 'www.sample-redirect.com',
         statusCode: 302
       })
    );

    const result = await exportedFuncs.buildInfo(pipelineContext);
    console.log('result',result);

    // the properties have different names because they're parsed by another internal function
    const { redirectStatusCode, redirectUrl } = result.redirect;

    assert.strictEqual(redirectUrl, 'www.sample-redirect.com');
    assert.strictEqual(redirectStatusCode, 302);
  });
});
我在这些测试中得到的结果是,第一个测试如预期一样通过,但第二个测试失败,并且console.log显示:

{
  defaultValue: {
    code: 'test'
  },
  redirect: null
}
这是模拟后第一个测试用例的预期结果。我期望它能回来的是:

{
  defaultValue: null,
  redirect: {
    redirectUrl: 'www.sample-redirect.com',
    redirectStatusCode: 302
  }
}
另外,如果我对第一个测试用例进行注释,并仅运行第二个测试用例,则测试通过

你们能告诉我我做错了什么吗


非常感谢。

您需要使用
this.mock
声明并引用该变量,而不是将其声明为闭包(
让mock:any

异步测试并行运行,两个测试同时访问同一个变量。这就是为什么你会看到这种行为


只需确保在测试函数中使用
function(){…}
而不是
()=>{…}
语法,否则它将无法按预期工作。

谢谢,这完全有道理。。。我会在周一试试,看看是否有效,然后标出答案。