我有一个场景,其中有两个方法的接口:
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
,这意味着MethodB
是MethodA
的一部分。
所以我们需要测试它
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);