如何测试调用该接口的另一个方法的接口方法?



我有一个场景,其中有两个方法的接口:

public interface IStudent
{
public void MethodA();
public void MethodB();
}

MethodA的实现调用了MethodB以及其他接口的方法。

public class Student: IStudent
{
private readonly IBook _book;
private readonly IClassRoom _classRoom;
private readonly ITeacher _teacher;
public Student(
IClassRoom classRoom,
IBook book,
ITeacher teacher)
{
_book = book;
_classRoom = classRoom;
_teacher = teacher;
}
public void MethodA()
{
_book.Get();
_classRoom.Get();
this.MethodB();
///Other logic...
}
public void MethodB()
{
_teacher.Get();
}
}

我尝试用moq模拟IBook,ITeacher,IClassRoom,并通过构造注入测试MethodA

public void IStudentMethodATest()
{
var bookMock = new Moq<IClassRoom>().Setup(book => book.Get());
var classRoomMock = new Moq<IClassRoom>().Setup(classRoom => classRoom.Get());
var student = new Student() { classRoomMock.object, bookMock.object, null };
student.MethodA();
bookMock.Verify(book => book.Get(), Times.Once);
classRoomMock.Verify(classRoom => classRoom.Get(), Times.Once);
}

但是我不知道如何处理MethodA中调用MethodB的部分。

有什么建议吗?

我认为我们可能需要模拟ITeacher接口,因为MethodA将调用MethodB,这意味着MethodBMethodA的一部分。

所以我们需要测试它

var bookMock = new Moq<IClassRoom>().Setup(book => book.Get());
var classRoomMock = new Moq<IClassRoom>().Setup(classRoom => classRoom.Get());
var teacherMock = new Moq<ITeacher>().Setup(teaher => teaher.Get());
var student = new Student() { classRoomMock.object, bookMock.object, teacherMock.object };
student.MethodA();
bookMock.Verify(book => book.Get(), Times.Once);
classRoomMock.Verify(classRoom => classRoom.Get(), Times.Once);

首先接口中没有访问修饰符

public interface IStudent
{
void MethodA();
void MethodB();
}
其次,单元测试应该用假的依赖来测试真正的Student类:
var bookMock = new Moq<IBook>();
//if the function returns object
bookMock.Setup(book => book.Get()).Returns(something);
var classRoomMock = new Moq<IClassRoom>();
classRoomMock.Setup(classRoom => classRoom.Get()).Returns(something);
var teacherMock = new Moq<ITeacher>().Setup(teaher => teaher.Get());
var student = new Student() { classRoomMock.object, bookMock.object, teacherMock.object };
student.MethodA();
bookMock.Verify(book => book.Get(), Times.Once);
classRoomMock.Verify(classRoom => classRoom.Get(), Times.Once);

最新更新