当我调试控制器索引方法时,它返回一个空模型,我做错了什么? 我正在使用Daniel Cazzulino和xUnit的Moq

以下是我的控制器代码:

TeacherController:

public class TeacherController : Controller
{
    private IClassScheduleUnitOfWork _classScheduleUnitOfWork { get; set; }

    public TeacherController(IClassScheduleUnitOfWork classScheduleUnitOfWork)
    {
        _classScheduleUnitOfWork = classScheduleUnitOfWork;
    }

    public ViewResult Index()
    {
        var options = new QueryOptions<Teacher> {
            OrderBy = t => t.LastName
        };
        IEnumerable<Teacher> list = _classScheduleUnitOfWork.teachers.List(options);
        return View("Index", list);
    }
}

Here is my Unit test controller code:

public class TeacherControllerTests
{
    private readonly Mock<IClassScheduleUnitOfWork> _mock;

    public TeacherControllerTests()
    {
        _mock = new Mock<IClassScheduleUnitOfWork>();
    }

    [Fact]
    public void IndexActionMethod_ReturnsAViewResult()
    {
        var options = new QueryOptions<Teacher>
        {
            OrderBy = t => t.LastName
        };

        IEnumerable<Teacher> teachersList = GetAllTeachers();
 
        _mock.Setup(x =>x.teachers.List(options))
            .Returns(teachersList);

        var controller = new TeacherController(_mock.Object);

        //act
        var result = controller.Index();
        var actualData = (IEnumerable<Teacher>?)result?.ViewData.Model;
        Assert.Equal(5, actualData?.Count());

   }

   private IEnumerable<Teacher> GetAllTeachers()
   {
        IEnumerable<Teacher> teachers = new List<Teacher>()
        {
           new Teacher { TeacherId = 1, FirstName = "Anne", LastName = "Sullivan" },
           new Teacher { TeacherId = 2, FirstName = "Maria", LastName = "Montessori" },
           new Teacher { TeacherId = 3, FirstName = "Martin Luther", LastName = "King" },
           new Teacher { TeacherId = 4, FirstName = "", LastName = "Aristotle" },
           new Teacher { TeacherId = 5, FirstName = "Jaime", LastName = "Escalante" }
       };

       teachers = teachers.OrderBy(t => t.LastName).ToList();

       return teachers;
   }
}

下面是IClassScheduleUnitOfWork的定义

 public interface IClassScheduleUnitOfWork
 {
     public IRepository<Teacher> teachers { get; set; }
     public IRepository<Class> classes { get; set; }
     public IRepository<Day> days { get; set; }

     public void Save();

 }

以下是IRepository代码:

 public interface IRepository<T> where T : class
 {
     IEnumerable<T> List(QueryOptions<T> options);
     T? Get(int id);
     T? Get(QueryOptions<T> queryOptions);
     void Insert(T entity);
     void Update(T entity);
     void Delete(T entity);
     void Save();
 }

推荐答案

问题是测试is not the same object中的QueryOptions<Teacher>对象(options)作为被测系统(SUT)中的QueryOptions<Teacher>对象(options).

因此,表达式x =>x.teachers.List(options)将永远不会匹配.

您可以稍微放宽Setup以使测试通过:

_mock.Setup(x => x.teachers.List(It.IsAny<QueryOptions<Teacher>>()))
    .Returns(teachersList);

不过,如果是我,我会重新判断我的 Select ,因为正是出于这个原因,这是一个不适合测试的设计.

Csharp相关问答推荐

使用其可能实现的基类和接口的属性的方法

Dapper是否可以自动扩展类成员

EF Core. Income和. AsNoTracking正确用法

C++/C#HostFXR通过std::tuple传递参数

如何在C#中将对象[*,*]直接转换为字符串[*,*]?

在具有主构造函数的类中初始化属性时出现警告

最新的Mediatr和具有同步方法的处理程序Handle:并非所有代码路径都返回值"

StackExchange.Redis.RedisServerException:调用ITransaction.ExecuteAsync()时出现错误未知命令取消监视

Cosmos SDK和Newtonsoft对静态只读记录的可能Mutations

在.NET MAUI.NET 8中如何防止按钮点击时出现灰色反馈

C#-VS2022:全局使用和保存时的代码清理

未找到任何HTTP触发器.成功部署Azure Functions Project后(c#)

如何使用MailKit删除邮箱?

当空判断结果赋给变量时,为什么会出现可能空异常警告的解引用?

JsonPath在Newtonsoft.Json';S实现中的赋值

ASP.NET MVC数据批注验证组复选框

如何使用实体框架核心对字符串_agg使用强制转换为varchar(Max)

如果所有";async任务方法()";调用都返回Task.FromResult()-是否同步执行?

实例化列表时的集合表达式是什么?

将带有嵌套If-Else的Foreach循环转换为Linq表达式