日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单元测试(三)基本使用

發布時間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单元测试(三)基本使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

本文來演示一下同事教導后的寫法,同樣有些單元測試是為了演示而寫的單元測試。

本文使用組件:Xunit、Moq以及dotNet相關知識

注:本文內容基于上一篇

操作

首先指定一個方法編寫單元測試,并且要保證沒有其他因素干擾的情況下去進行單元測試。

創建單元測試項目

參考上篇文章,在上篇文章的基礎上進行如下代碼。

測試方法

首先先繼承公共類,然后注入日志組件

public?class?UserServiceTest?:?BaseWebHostTest {public?UserServiceTest(ITestOutputHelper?helper)?:?base(helper){} }

比如我們去對IUserService里面的GetListAsync做單元測試,然后查看該Service依賴于一些配置

private?readonly?IBaseRepository<User>?_userRep; private?readonly?IUnitOfWork?_unitOfWork; private?readonly?IMapper?_mapper;public?UserService(IMapper?mapper,IBaseRepository<User>?userRep,?IUnitOfWork?unitOfWork) {_mapper?=?mapper;_userRep?=?userRep;_unitOfWork?=?unitOfWork; }

那么我們就需要使用moq組件去模擬出來這些依賴項減少影響。不過該接口有些依賴項用不到,不需要模擬直接傳null

//模擬用戶數據 var?users?=?new?List<User> {new?User?{Account?=?"123",?PassWord?=?"123456",?IsValid?=?true},new?User?{Account?=?"456",?PassWord?=?"123456",?IsValid?=?true}, }; //?mock?數據 var?mockRepository?=?new?Mock<IBaseRepository<User>>(); mockRepository.Setup(t?=>?t.GetListAsync(_?=>?true)).ReturnsAsync(users);

然后就可以實例化UserService進行使用,完整代碼如下

[Fact] public?async?Task?GetUser_ReturnOk() {//Arrange:準備階段//模擬用戶數據var?users?=?new?List<User>{new?User?{Account?=?"123",?PassWord?=?"123456",?IsValid?=?true},new?User?{Account?=?"456",?PassWord?=?"123456",?IsValid?=?true},};var?mockRepository?=?new?Mock<IBaseRepository<User>>();mockRepository.Setup(t?=>?t.GetListAsync(_?=>?true)).ReturnsAsync(users);var?userService?=?new?UserService(null,?mockRepository.Object,?null);//Act:行為階段var?result?=?await?userService.GetListAsync();//Assert:斷言階段Assert.True(result.Any());Output.WriteLine(JsonConvert.SerializeObject(result)); }

然后就可以對該方法進行單元測試了。

下面在演示一個對用戶添加的方法編寫單元測試

img

因為我們依賴這三個東西,那么就需要mock這三個

var?mockRepository?=?new?Mock<IBaseRepository<User>>(); mockRepository.Setup(t?=>?t.AddAsync(It.IsAny<User>(),?false)).ReturnsAsync(1);var?mockUnitWork?=?new?Mock<IUnitOfWork>(); mockUnitWork.Setup(t?=>?t.SaveChangesAsync(new?System.Threading.CancellationToken())).ReturnsAsync(1);var?vm?=?new?AddUserVm?{?Account?=?"789",?PassWord?=?"455",?Sex?=?Net5ByDocker.Model.Enum.SexEnum.Man?};var?mockIMapper?=?new?Mock<IMapper>(); mockIMapper.Setup(t?=>?t.Map<User>(vm)).Returns(new?User?{?Account?=?"789",?PassWord?=?"455",?IsValid?=?true?});

這里我們模擬IBaseRepository傳入任何的User到添加方法都返回,模擬單元提交也返回1,還模擬了IMapper進行映射,完整代碼如下

[Fact] public?async?Task?AddUser_ReturnOk() {//?模擬數據var?mockRepository?=?new?Mock<IBaseRepository<User>>();mockRepository.Setup(t?=>?t.AddAsync(It.IsAny<User>(),?false)).ReturnsAsync(1);var?mockUnitWork?=?new?Mock<IUnitOfWork>();mockUnitWork.Setup(t?=>?t.SaveChangesAsync(new?System.Threading.CancellationToken())).ReturnsAsync(1);var?vm?=?new?AddUserVm?{?Account?=?"789",?PassWord?=?"455",?Sex?=?Net5ByDocker.Model.Enum.SexEnum.Man?};var?mockIMapper?=?new?Mock<IMapper>();mockIMapper.Setup(t?=>?t.Map<User>(vm)).Returns(new?User?{?Account?=?"789",?PassWord?=?"455",?IsValid?=?true?});var?userService?=?new?UserService(mockIMapper.Object,?mockRepository.Object,?mockUnitWork.Object);//行為階段var?result?=?await?userService.AddAsync(vm);//?斷言階段Assert.NotEmpty(result);Output.WriteLine(result); }

然后單元測試就編寫完成了,啟動單元測試

img

單元測試成功,我理解的大概就是這樣子的,如果有哪里不對的地方,麻煩指出來一起成長。

資料

.NetCore單元測試:https://www.cnblogs.com/baoshu/p/14500273.html

Mock:https://github.com/Moq/moq4/wiki/Quickstart

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的单元测试(三)基本使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。