簡體   English   中英

Nunit System.InvalidOperationException

[英]Nunit System.InvalidOperationException

這是我想測試的方法:

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指定的測試方法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.'

它在您的測試中失敗並顯示相同的錯誤消息

這與 MOQ 設置無關。

您的測試方法試圖將nullint ,從而導致運行時錯誤。

這意味着傳遞給被測方法的UserId為空。

您需要為用戶 ID 設置一個值,以便可以執行測試直至完成。

//...

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

ModifyuserService.Update(user);

//...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM