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

发布于 2022-09-07 15:43:38 字数 512 浏览 33 评论 0

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

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

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

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


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


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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

鹿童谣 2022-09-14 15:43:38

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

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

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

迷乱花海 2022-09-14 15:43:38

你说的是前端吧?像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来返回伪造的时间。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文