c# - 如何对返回 void 的 DAO 更新/删除方法进行单元测试?

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

我有两种方法,我真的不知道如何测试。它们位于 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 方法的情况下离开此测试吗?如果没有,我该如何测试?

最佳答案

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

[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());
}

关于c# - 如何对返回 void 的 DAO 更新/删除方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60387272/

相关文章:

c# - 为什么 LinkedListNode Next 属性是只读的?

c# - 使可放置对象与网格对齐

c# - 是否有内置的方法来识别类的实例?

java - Robolectric - AndroidStudio - 找不到参数的方法 testCompile()

angularjs - 对 Angular-UI 模式的 View 进行单元测试

android - 对使用 kotlin 协程的改造调用进行单元测试

c# - 使用 And 和 Or 关键字搜索实现高级搜索

C# 控制台应用程序使用命令行,命令不执行

c# - ContentType.Xml 不存在?

.net - 如何将二进制数据流式传输到 .NET 中的标准输出?