尼尼特 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);

//...