函数返回列表< >由其他函数调用

本文关键字:其他 函数调用 返回 列表 函数 | 更新日期: 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提供了几种方法来检查