【问题标题】:How to unit test DAO Update/Remove methods that return void?如何对返回 void 的 DAO 更新/删除方法进行单元测试?
【发布时间】:2020-06-08 18:04:55
【问题描述】:

我有两种方法,我真的不知道如何测试。它们属于UserService 类:

    public async Task UpdateUser(int userId, UserInput userInput)
    {
        var user = await _userRepository.Get(userId);
        if (user != null)
        {
            user.Name = userInput.Name;
            _userRepository.Update(user);
        }
    }

    public async Task RemoveUser(int userId)
    {
        var user = await _userRepository.Get(userId);
        if (user != null)
        {
            _userRepository.Remove(user);
        }
    }

这是我为Update 方法编写的测试:

    [Fact]
    public async void UpdateUser()
    {
        var repository = new Mock<IUserRepository>();
        repository.Setup(r => r.Get(1)).ReturnsAsync(new User(1, "John Doe"));
        repository.Setup(r => r.Update(It.IsAny<User>()));

        var userService = new UserService(repository.Object, SingletonAutoMapper.Mapper);

        var userInput = new UserInput { Name = "John Doe" };
        await userService.Update(1, userInput);
    }

所以在UpdateUser 中,我使用的唯一方法来自存储库,我准确地告诉了要返回什么。此外,我什至没有从中返回任何内容(PUT web api 方法应该返回 204 No Content 状态)。

(本类使用Mapper,但这两种方法中没有,请不要介意)

我可以在没有Assert 方法的情况下离开这个测试吗?如果不是,我应该如何测试它?

【问题讨论】:

  • 让模拟验证它收到了预期的输入
  • @Nkosi 我不确定我是否理解你的问题。我发布的测试就是我得到的。
  • 这能回答你的问题吗? Unit Test a method that returns a void
  • @devNull 是的,谢谢

标签: c# .net unit-testing testing asp.net-core-webapi


【解决方案1】:

让 mock 验证它是否收到了预期的输入

[Fact]
public async Task UpdateUser() {
    //Arrange
    var expectedId = 1;
    var expectedName = "John Doe";
    var expectedUser = new User(expectedId, expectedName);

    var repository = new Mock<IUserRepository>();
    repository.Setup(r => r.Get(expectedId)).ReturnsAsync(expectedUser);        

    var userService = new UserService(repository.Object, SingletonAutoMapper.Mapper);
    var userInput = new UserInput { Name = "John Doe" };

    //Act
    await userService.Update(expectedId, userInput);

    //Assert
    repository.Verify(_ => _.Update(expectedUser), Times.Once());
}

【讨论】:

  • 你删除了repository.Setup(r =&gt; r.Update(It.IsAny&lt;User&gt;()));。你能解释一下为什么吗?
  • 因为它什么都不做,所以没有必要设置它。它什么都不做
猜你喜欢
  • 2014-05-10
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2016-10-18
  • 2011-06-26
相关资源
最近更新 更多