You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# .NET Core的Xunit测试中为Void方法添加断言

如何在XUnit中为Void方法添加断言?

嘿,这个问题我熟!因为你测试的是无返回值的void方法,没法直接断言返回结果,所以我们要换个思路——验证依赖的仓储服务是否被正确调用了,毕竟你的AddStudents方法应该是把逻辑委托给了_studentRepository对吧?

针对你的测试代码,我们可以利用Moq框架的Verify方法来做断言,下面是几种常用的场景:

1. 基础验证:确认方法被调用指定次数

这是最常用的场景,确保仓储的AddStudents方法确实被调用了一次,且传入的参数是你准备的student对象:

//Assert
_studentRepositoryMock.Verify(s => s.AddStudents(student), Times.Once);

这里的Times.Once可以根据你的业务逻辑换成Times.Exactly(2)(调用两次)、Times.AtLeastOnce(至少一次)等。

2. 严格参数匹配:验证参数属性是否正确

如果担心引用对象的匹配问题(比如方法内部可能复制了对象属性而非直接传递引用),可以用It.Is<T>来匹配参数的具体属性:

//Assert
_studentRepositoryMock.Verify(s => s.AddStudents(It.Is<StudentDto>(dto => 
    dto.Id == student.Id && 
    dto.Name == student.Name &&
    dto.Age == student.Age
)), Times.Once);

这样即使方法内部创建了新的StudentDto实例,只要属性和你准备的测试数据一致,断言就能通过,更精准地验证业务逻辑是否正确传递了参数。

3. 验证方法未被调用(分支场景测试)

如果你的业务逻辑存在某些分支,比如当学生数据不合法时不会调用仓储方法,就可以用这个断言:

//Assert
_studentRepositoryMock.Verify(s => s.AddStudents(It.IsAny<StudentDto>()), Times.Never);

完整的测试代码示例

最后,把断言加到你的测试里,完整代码如下:

[Fact()] 
public async Task AddStudent() 
{ 
    //Arrange 
    StudentDto student= StudentDataSource.studentDto(); 
    _studentRepositoryMock.Setup(s => s.AddStudents(student)); 
    // Act 
    _studentService.AddStudents(student); 
    //Assert 
    _studentRepositoryMock.Verify(s => s.AddStudents(student), Times.Once);
}

内容的提问来源于stack exchange,提问作者user1528398

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 14:49:06