如何在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
相关产品推荐
相关产品推荐

