Nunit System.InvalidOperationException - PullRequest
       25

Nunit System.InvalidOperationException

1 голос
/ 27 марта 2020

Это метод, который я хочу протестировать:

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;
}

1 Ответ

1 голос
/ 27 марта 2020

Я только что выполнил тест

int? x = null; 
int y = (int)x; //System.InvalidOperationException: 'Nullable object must have a value.'

, и он не работает с тем же сообщением об ошибке в вашем тесте

Это не имеет никакого отношения к установке MOQ.

Тестируемый метод пытается привести null к int, что вызывает ошибку времени выполнения.

Это означает, что UserId, переданный тестируемому методу, равен нулю ,

Вам необходимо установить значение для идентификатора пользователя, чтобы можно было выполнить тест до конца.

//...

var user = new User() {
    UserId = 0
};

ModifyuserService.Update(user);

//...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...