gpt4 book ai didi

unit-testing - 将一个测试分成多个测试有哪些经验法则?

转载 作者:行者123 更新时间:2023-11-28 21:19:03 25 4
gpt4 key购买 nike

好的,所以我有这段代码:

public TbMtUserDTO RecoverUser(long userId, UpdateTbMtUserDTO updatedData)
{
TbMtUser user = _usersRepository.FindUserById(userId);
if (user == null ||
(updatedData.IdRecSet == "Password" && String.IsNullOrEmpty(updatedData.DsUpdatedPassword)))
{
return null;
}

switch (updatedData.IdRecSet)
{
case "Username":
return _mapper.Map<TbMtUserDTO>(user);
case "Password":
user.DsPassword = PasswordHasher.Hash(updatedData.DsUpdatedPassword);
_usersRepository.SaveChanges();
return _mapper.Map<TbMtUserDTO>(user);
}
throw new InvalidOperationException(
String.Format(RECOVER_USER_ERROR, updatedData.IdRecSet));
}

当我为那段代码编写测试用例时,当我不得不为其中一个“密码”用例编写测试时,这就是我所做的:

    [Fact]
public void UpdatesPasswordSuccessfully()
{
string oldPassword = _user.DsPassword;
UpdateTbMtUserDTO updateTbMtUserDto = new UpdateTbMtUserDTO()
{
IdRecSet = "Password",
DsUpdatedPassword = "new_password"
};
_usersRepositoryMock
.Setup(x => x.FindUserById(It.IsAny<long>()))
.Returns(_user);
_mapperMock
.Setup(x => x.Map<TbMtUserDTO>(It.IsAny<TbMtUser>()))
.Returns(new TbMtUserDTO());
TbMtUserDTO userDto = _usersService.RecoverUser(_user.CdUser, updateTbMtUserDto);
_usersRepositoryMock.Verify(x => x.SaveChanges(), Times.Once);
Assert.NotNull(userDto);
Assert.True(oldPassword != _user.DsPassword);
}

如您所见,该测试的底部有三个断言。我首先检查 SaveChanges 是否被调用,然后我验证该方法确实返回了一些东西,因此 NotNull 断言并且它实际上修改了密码(True 断言)。

但我觉得这不是正确的做法。但在我看来,这些测试是相关的,但我不确定是否应该将它们分成三个不同的测试。问题是我必须为这三个案例安排相同的部分,老实说,我认为这也不是一个好主意。

大家怎么看?几个月来我一直在实现单元测试,那么在这些情况下,您有哪些经验法则?

最佳答案

也许如果您考虑将一个测试拆分为多个测试,您应该将您的方法拆分为多个类/方法并为它们编写测试?我不想深入架构,但这可能是一个解决方案。特别是我会分开这个:

if (user == null || (updatedData.IdRecSet == "Password" 
&& String.IsNullOrEmpty(updatedData.DsUpdatedPassword)))
{
return null;
}

还有这个

user.DsPassword = PasswordHasher.Hash(updatedData.DsUpdatedPassword);
_usersRepository.SaveChanges();

关于unit-testing - 将一个测试分成多个测试有哪些经验法则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54390279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com