如果之前抛出如何验证方法已达到

How to verify method was reached if throw before

我有下面的方法,当数据库中不存在这样的 user nameadds new user to database。如果 user name 存在 throws custom exception 因此 addUserType 方法未达到。

public void CreateUserType(UserType userType)
{
    if (userType == null) throw new ApplicationException("UserType object cannot be null");

    if (_bottleClientQuery.IsUserTypeExist(userType.Name)) throw new ApplicationException("Such user type name already exist");
    _bottleClientRepository.AddUserType(userType);
}

我的测试方法如下图:

此方法正确地给出了我预期的结果:

[Test]
public void CreateUserType_UserTypeExists_ThrowsApplicationException()
{
       UserQuery.Setup(uow => uow.IsUserTypeExist(It.IsAny<string>())).Returns(true);

       Assert.Throws<Exceptions.ApplicationException>(() => CreateClientService.CreateUserType(new UserType()));
}

尽管如此,我想在这个方法中检查是否 AddUserType was reached。我 setup 它作为 IsUserTypeExist returns true 这意味着 user name exist 因此 AddUserType 将无法到达。

[Test]
public void CreateUserType_UserTypeExists_AddUserTypeRepositoryNotReached()
{
       UserQuery.Setup(uow => uow.IsUserTypeExist(It.IsAny<string>())).Returns(true);

        CreateClientService.CreateUserType(new UserType());

        UserRepository.Verify(uow => uow.AddUserType(It.IsAny<UserType>()),Times.Never);
}

第二种测试方法的问题是 ApplicationExceptionthrown(完全没问题,符合预期)但我真的很想测试 AddUserType 是否是 not reached .

有没有可能是之前抛出的异常?

你可以把你的测试方法改成这样;

[Test]
public void CreateUserType_UserTypeExists_AddUserTypeRepositoryNotReached()
{
    UserQuery.Setup(uow => uow.IsUserTypeExist(It.IsAny<string>())).Returns(true);

    Assert.Throws<ApplicationException>(() => CreateClientService.CreateUserType(new UserType()));

    UserRepository.Verify(uow => uow.AddUserType(It.IsAny<UserType>()),Times.Never);
}

这将验证是否抛出了预期的异常并确保执行继续到您的下一次验证。