Это метод, который я хочу протестировать:
void Update(User user)
{
if (_userQuery.IsNameExist(user.Guid, (int) user.UserId, user.Name))
UpdateUser(user);
}
Ниже тестового класса с методом Update_Test()
, который должен тестировать выше единицы.
[TestFixture]
class ModifyuserServiceTest
{
private IModifyUserService ModifyUserService { get; set; }
private Mock<IUserQuery> UserQuery { get; set; }
private Mock<IUserRepository> UserRepository { get; set; }
[SetUp]
public void SetUp()
{
userQuery = new Mock<IUserQuery>();
UserRepository = new Mock<IUserRepository>();
ModifyUserService = new ModifyUserService(userQuery.Object, UserRepository.Object);
}
[Test]
public void Update_Test()
{
userQuery.Setup(uow => uow.IsNameExist(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<string>()))
.Returns(true);
ModifyuserService.Update(new User());
UserRepository.Verify(uow => uow.Add(It.IsAny<User>()), Times.Once);
}
}
По какой-либо причине я получаю ошибку:
System.InvalidOperationException : Nullable object must have a value.
Когда я отлаживаю тестовый метод, возникает ошибка в этой строке в тестируемом методе:
if (_userQuery.IsNameExist(user.Guid, (int) user.UserId, user.Name))
Когда я смотрю на значения аргументов: 0, null, null
, что кажется забавным, как в моем методе тестирования, который я указал в userQuery.Setup
:
It.IsAny<int>(), It.IsAny<int>(), It.IsAny<string>()
Я даже пытался так:
userQuery.Setup(uow => uow.IsNameExist(999, 33, "whatever"))
тем не менее снова возникает та же ошибка, и там отображаются значения: 0, null, null
Что здесь не так?
Обновление:
public bool IsNameExist(int guid, int userId, string name)
{
Parameters = new List<IDbDataParameter>
{
Context.CreateParameter("@Guid", guid, DbType.Int64),
Context.CreateParameter("@userId", userId, DbType.Int64),
Context.CreateParameter("@Name", name, DbType.String)
};
var count = (int)Context.GetScalarValue($"SELECT count(*) FROM {UserTable} WHERE userId=@userId And Guid=@Guid And Name=@Name", CommandType.Text,
Parameters.ToArray(), null);
return count > 0;
}