单元测试(三)基本使用
介紹
本文來演示一下同事教導后的寫法,同樣有些單元測試是為了演示而寫的單元測試。
本文使用組件: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
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的单元测试(三)基本使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WTM框架使用技巧之:CI/DI(持续集
- 下一篇: BeetleX.WebFamily文件图