代码是针对UserService.Add()编写单元测试,用到了Moq,整个测试写下来能通过,感觉写的不对(没有意义)。正确的做法应该怎么来写这个测试?希望能指出我理解错误的地方或者伪代码也行。
public class UserService : IUserService { private IUserRepository _userRepository; private IFundRepository _fundRepository; private IUnitOfWork _unitOfWork; public UserService(IUserRepository userRepository,IFundRepository fundRepository,IUnitOfWork unitOfWork) { _userRepository = userRepository; _fundRepository = fundRepository; _unitOfWork = unitOfWork; } public async Task<bool> Add(AddUserDto addUserDto) { var user = Mapper.Map<User>(addUserDto); _userRepository.Add(user); _fundRepository.Add(new Fund() { User= user,Balance=addUserDto.Balance }); return await _unitOfWork.CommitAsync() > 0; } }
public class UserServiceTests { public UserServiceTests() { AutoMapperConfiguration.Initial(); } [Fact] public async void AddTest() { //fack data var addUserDto = new AddUserDto() {Balance=0,Email= "666@qq.com",NickName= "ww" }; var user = Mapper.Map<User>(addUserDto); var fund = new Fund() { Balance = addUserDto.Balance, User = user }; var userRepository = new Mock<IUserRepository>(); var fundRepository = new Mock<IFundRepository>(); var unitOfWork = new Mock<IUnitOfWork>(); userRepository.Setup(u => u.Add(user)); fundRepository.Setup(f => f.Add(fund)); unitOfWork.Setup(w => w.CommitAsync()).Returns(Task.FromResult(2)); UserService userService = new UserService(userRepository.Object, fundRepository.Object, unitOfWork.Object); var result = await userService.Add(addUserDto); Assert.True(result); } }
你既然已经有了UOW了,那么这里的rollback的testcase呢?
rollback是EF处理的
根据业务需求组织测试,业务场景、参数范围、错误处理。。。。
你这个感觉是代码写完了,后补的测
是的,这是个Demo
单元测试,重点是单元,你希望这个测试测试的是哪一个用例,哪一种情况。要防止的是哪一种可能的错误。
UserService.add()就是一个工作单元,添加一个用户同时给这个用户添加一个资金账户。可能出现的错误大概就是用户已存在或者字段类型不匹配或者过长吧,这样一来是不是应该写针对领域逻辑的测试?因为上述错误点都应该是在领域逻辑里面判断。