一周小结

比特弦歌者
• 阅读 1428

前言

这周开始接触到了十分正式的项目开发,感觉自己距离能实战真的差太多了,有一些小问题可能要半天或者更久才能解决,单元测试还是硬伤,效率低的不行,早起九点开始写代码,晚上十一点多结束,甚至有一次肝到一点多,但是解决的问题不多,感觉自己有程序员加班的潜质,还没有写好代码的水平,跟代码交流挺有意思的,只是现在能力有限,有些问题还不能有效地解决,这一周的问题还真不少,总结性的整理了一下。

带有param的GET请求单元测试

之前对单元测试的理解是路由对上了就能过,即请求的url与预测的url对应上就可以了,殊不知并非所有的预测url与请求url一致就可以,比如GET方法,下面是一个GET方法的请求:

  public  getUserByUsername(username: string): Observable<boolean> {
    return this.httpClient.get<boolean>(`${this.baseUrl}/getUserByUsername`, {params: {username}});
  }

下面是测试:

 it('getUserByUsername', () => {
    const username = Random.nextString ('', 11);
    let result;
    /* 进行订阅,发送数据后将called置true */
    let called = false;
    service.getUserByUsername(username).subscribe ((data) => {
      called = true;
      result = data;
    });
    const request = httpController.expectOne ( `${baseUrl}/getUserByUsername`);
    expect (request.request.method).toEqual ('GET');
    req.flush(of(undefined));
    expect (called).toBe (true);
  });

然后运行测试:
一周小结
当时不是很理解为何报错,后来问了一下潘老师,然后老师说教程上有:5 测试HTTP请求【前】,就看到了这:

 const req = httpTestingController.expectOne('http://localhost:8080/Klass?name=');

我以为加上参数就好了,然后就改成了这样:

 const request = httpController.expectOne ( `${baseUrl}/getUserByUsername?username=`);

结果可想而知,还是ERROR,然后启动项目,打开控制台看了一下实际请求的:
一周小结
注:该方法并非项目原有的方法,只是为了演示,所以请求时会发生错误。
实际请求的url带有参数名和参数,然后就改成了这样:

 it('getUserByUsername', () => {
    const username = Random.nextString('', 11);
    let result;
    /* 进行订阅,发送数据后将called置true */
    let called = false;
    service.getUserByUsername(username).subscribe ((data) => {
      called = true;
      result = data;
    });
    const request = httpController.expectOne( `${baseUrl}/getUserByUsername?usename=${username}`);
    expect(request.request.method).toEqual('GET');
    req.flush(of(undefined));
    expect(called).toBe(true);
  });

再次测试通过。
一周小结

在解决问题的时候看到StackOverflow解决同样问题的博客下面有人这样说,然后就懵了,毕竟教程用的expectOne()测试的带有参数的url,经过自己实践才发现实践出真知,听到的看到的都不一定是正确的。
一周小结

结论

测试请求时,如果没有把握就实际调用一下,看一下实际请求的url,预测的url要和实际请求的url完全一致。

HTTP请求

之前经常用到的HTTP请求有GET,POST,PUT,DELETE等,
最近接触到了PATCH,对于PATCH也只是在教程里听说过,第一次用也不知道咋用,然后就查了一下:

PATCH是对 PUT 方法的补充,用来对已知资源进行局部更新 。

当时对patch请求不是很熟悉,然后就开始了“创作”:
老师已经给了后台,前台怎么传不是很熟悉,一开始想着直接传:

 updatePasswordOfCurrentLoginUser(password: Password): Observable<void> {
        return this.http.patch<void>(`${this.baseUrl}/updatePasswordOfCurrentLoginUser`, password);
    }

殊不知后台只接收JSON对象,然后就改成了:

updatePasswordOfCurrentLoginUser(password: Password): Observable<void> {
        return this.http.patch<void>(`${this.baseUrl}/updatePasswordOfCurrentLoginUser`, {params:rePassword});
    }

但是@RequestBody却不收:
一周小结
然后只能传一个User对象过去,把后台需要的值给User相应的属性就好了。

小结

本以为照着别人的写能成功,但发现自己想的太天真,并没有对应上。
一周小结
后来在教程里发现了请求对应的前后台写法:
一周小结
绑定到用户输入事件【前】

总结

之前写代码都是Ctrl + C , Ctrl + V ,没有切实地去体会代码的意思,在出错误之前一直以为自己的想法是对的,然后就一直照着自己的想法来,出错了就懵了,各种想不通,好在这次把问题暴露出来了,改正了自己的一些想法,也补齐了一些知识性上的缺陷,当然也知道了遇到不会的先去教程找找,否则再遇上同样的问题,又要好久才能解决。
最后,感谢潘老师和学长们以及小伙伴们给予的指导和帮助。

本文作者:河北工业大学梦云智开发团队 张文达

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
双十一预售活动分析
2022年双十一促销活动已经开始,大家应该都提前开始关注今年双十一活动的时间表了吧?2022年10月24日晚8:00天猫双11预售时间,第一波销售时间10月31日晚8:0,第二波销售时间11月10日晚8:00;天猫双11的优惠力度是跨店每满30050
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Wesley13 Wesley13
3年前
IOS真机测试
学习了两天的Android开发,我感觉Android开发跟IOS开发和.NET平台下的开发有点不同,Android开发我更觉得跟web(Html)倒是有类似的地方,都是节点标签显示的,当然个人理解,感觉提示也没IOS开以及.NET开发那么强,可能是我还不是太熟悉eclipse开发环境,当然当做出东西能导入到自己的Android机还是挺兴奋的。今天晚上摸索了一
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Easter79 Easter79
3年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Wesley13 Wesley13
3年前
Java日期时间API系列23
  有时候,往往需要统计某个时间区间的销量等问题,这就需要准确的起始时间,获取准确开始时间00:00:00,获取准确结束时间23:59:59。下面增加了一一些方法,获取当天起始时间,昨天起始时间,当前月第一天开始时间,当前月最后一天结束时间,上个月第一天开始时间,上个月最后一天结束时间,某个指定月的起始结束时间等等。其中月份最后一天往往因为月份不同和
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
比特弦歌者
比特弦歌者
Lv1
习惯了孤独之后,一个人就是全世界。
文章
4
粉丝
0
获赞
0