【发布时间】:2020-03-27 14:20:24
【问题描述】:
这是我要测试的方法:
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;
}
【问题讨论】:
-
IsNameExist的定义是什么 -
@Nkosi 我发布了,但我认为这不是直接因为这种方法。
-
包括
UpdateUser,因为它是被测方法的一部分 -
@Nkosi 我不知道 - 我什至现在将它标记为虚拟,但它不会改变情况
-
@Nkosi 那时甚至还没有更新
标签: c# unit-testing nunit moq