尼尼特 System.InvalidOperationException
Nunit System.InvalidOperationException
这是我要测试的方法:
void Update(User user)
{
if (_userQuery.IsNameExist(user.Guid, (int) user.UserId, user.Name))
UpdateUser(user);
}
下面用方法 Update_Test()
测试 class,应该测试上面的方法。
[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;
}
我只是运行一个测试
int? x = null;
int y = (int)x; //System.InvalidOperationException: 'Nullable object must have a value.'
它失败并在您的测试中显示相同的错误消息
这与最小起订量设置无关。
您的测试方法正在尝试将 null
转换为 int
,导致 运行 次错误。
这意味着传递给被测方法的 UserId
为空。
您需要为用户 ID 设置一个值,以便完成测试。
//...
var user = new User() {
UserId = 0
};
ModifyuserService.Update(user);
//...
这是我要测试的方法:
void Update(User user)
{
if (_userQuery.IsNameExist(user.Guid, (int) user.UserId, user.Name))
UpdateUser(user);
}
下面用方法 Update_Test()
测试 class,应该测试上面的方法。
[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;
}
我只是运行一个测试
int? x = null;
int y = (int)x; //System.InvalidOperationException: 'Nullable object must have a value.'
它失败并在您的测试中显示相同的错误消息
这与最小起订量设置无关。
您的测试方法正在尝试将 null
转换为 int
,导致 运行 次错误。
这意味着传递给被测方法的 UserId
为空。
您需要为用户 ID 设置一个值,以便完成测试。
//...
var user = new User() {
UserId = 0
};
ModifyuserService.Update(user);
//...