「单元测试」A值在300秒后会变成B,我如何测试这个接口呢?

感谢 @betacat 的提醒,我删掉之前粗糙的例子,举一个具体的场景:

假设我需要对一款策略游戏进行测试。当前资源 15 单位,资源最少经过 300s 才会更新一次,我们按照公式计算,300s 后资源应该是 35 单位。

如果接口的时间取值是从系统时间获取的,我就很难直接伪造。所以请问:我该如何快速的进行测试

不知道各位大佬有什么好想法。


选答蟹蟹:比较全面的测试类书籍或中长篇教程(不限定语言,对“为什么要写测试”、“好的全面的测试该怎么设计”很迷茫),请推荐


@原罪 老师提供了「观察者模式:测试代码订阅事件主题,真正的执行程序发布事件主题。这种耦合是最低的」的答案,虽然没有解决我「如何快速进行测试」的困惑,但的确很有启发。

因在评论中,就贴上来供大家参考。再次感谢两位回答的大佬 :D

阅读 2.4k
3 个回答

首先你要回答为什么是300s后这个value才会变化,业务需求还是后台计算?

  • 如果只是单纯的等待一定长时间,那么这个等待值应该是可配置的。基于可配置的系统,你可以针对单元测试调整配置项。
  • 如果是后台计算真的很复杂需要300s,那么这也许是一个巨型接口,建议针对更内部的函数写单元测试。

为何写测试,你可以去阅读大神Martin Fowler的文章 https://martinfowler.com/arti...

你说的是前端吧?像mocha或者jasmine等框架,在test时都会传入一个done的结束函数。

describe('category', () => {
  it('some test', (done) => {
    // ...some code
    
    setTimeout(() => {
      // ...some code
      done();
    }, 301);
  });
});

执行done()即代表测试结束。

注意,如果你没有显性的写done形参,测试框架会立刻结束。如果有写形参,那么你必须执行done()才会结束

泻药。我建议用msg或者ioc隔离开获取时间的操作,然后直接hook msg进行伪造时间的reply,ioc则直接mock一个fake object来返回伪造的时间。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进