函数返回列表< >由其他函数调用
本文关键字:其他 函数调用 返回 列表 函数 | 更新日期: 2023-09-27 18:17:25
我是测试的新范围,我想使用FakeItEasy为这个业务逻辑的功能编写测试。在我的StudentsBusinessLogic
代码中,我想测试函数GetOldestStudent
。
- 列表项
public class StudentsBusinessLogic:IStudentsBusinessLogic
{
private IStudentRepository _studentRepository;
public StudentsBusinessLogic()
{
this._studentRepository = new DalConcreteFactory().GetStudentsRepository();
}
//I want to test this function
public Student GetOldestStudent()
{
var q1 = from students in this._studentRepository.AllStudents()
where students.Age >= ((from oldest in this._studentRepository.AllStudents()
select oldest.Age).Max())
select students;
Student result = q1.First();
Console.WriteLine(result.Age);
return result;
}
}
现在,我必须模拟代码片段:this._studentRepository.AllStudents()
,因为我不喜欢使用this._studentRepository.AllStudents()
(使用原始db)。我的问题是:如何用模拟studentRepository.AllStudents()
调用测试GetOldestStudent
。我试着写的测试是:
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
// Arrange
var fakeStuRep = A.Fake<IStudentRepository>();
var fakeFactory = A.Fake<DalAbstractFactory>();
A.CallTo(() => fakeStuRep.AllStudents()).Returns(new System.Collections.Generic.List<BE.Student> { new BE.Student { ID = 1, Age = 7 }, new BE.Student {ID = 2, Age = 55}});
A.CallTo(() => fakeFactory.GetStudentsRepository()).Returns(null);
// Act
IStudentsBusinessLogic bl = new StudentsBusinessLogic(true);
var res = bl.GetOldestStudent();
// Assert
Assert.AreEqual(55, res.Age);
}
}
不幸的是,由于IStudentRepository
ctor中的问题(与此作用域无关的特定问题),该测试导致运行时异常。但我想做的是跳过IStudentRepository
初始化阶段,而不是嘲笑它。有人能教我怎么做正确吗?
您需要打破业务逻辑类与存储库之间的具体依赖关系,例如:
public class StudentsBusinessLogic:IStudentsBusinessLogic
{
private IStudentRepository _studentRepository;
public StudentsBusinessLogic(IStudentRepository studentRepository)
{
this._studentRepository = studentRepository;
}
...
现在您可以将存储库的模拟实例传递给您的类:
var fakeStuRep = A.Fake<IStudentRepository>();
A.CallTo(() => fakeStuRep.AllStudents()).Returns(new System.Collections.Generic.List<BE.Student> { new BE.Student { ID = 1, Age = 7 }, new BE.Student {ID = 2, Age = 55}});
IStudentsBusinessLogic bl = new StudentsBusinessLogic(fakeStuRep);
var res = bl.GetOldestStudent();
最后,您已经很好地定义、初始化了模拟,并使用业务逻辑将其传递给具体类。
这是对业务逻辑类进行单元测试的一种方法。您不希望(至少现在不希望)调用实际的存储库或任何具体的DAL实现。
注意:您的测试应该断言调用了来自模拟存储库的方法。FakeItEasy提供了几种方法来检查