如何为 Web API 控制器编写单元测试

本文关键字:单元测试 控制器 API Web | 更新日期: 2023-09-27 18:31:54

我正在github上探索JohnPapa的CodeCamper项目https://github.com/johnpapa/CodeCamper。这是一个 ASP.Net 的SPA应用程序,我也在从事类似的项目。

我有兴趣为WebAPI控制器编写一些UnitTests。控制器承包商需要工作单元实例,并以Application_Start方法启动工作单元。

当我运行我的单元测试项目时,单位工作对象为空。如何从 UnitTest 项目启动 UnitofWork,以便运行我的测试方法。我希望自己说清楚。

下面是以下控制器的示例单元测试方法。

查找控制器.cs

用户控制器测试.cs

    [TestClass]
    public class UserControllerTest : ApiBaseController
    {
        [TestMethod]
        public void GetRoomsTest()
        {
            var controller = new LookupsController(Uow);
            var result = controller. GetRooms().Any();
            Assert.IsTrue(result);
        }
    }

再次为什么 Uow 为空?我应该怎么做,以便我可以为这种类型的项目/架构编写单元测试方法。

有关代码的更多详细信息,您可以查看github repo.https://github.com/johnpapa/CodeCamper

如何为 Web API 控制器编写单元测试

使用任何模拟框架为ICodeCamperUow创建一个假/存根/模拟(下面我使用的是 NSubstitute):

[TestMethod]
public void GetRoomsTest()
{
  // UOW we need to use
  var fakeUOW = Substitute.For<ICodeCamperUow>();
  // setting up room repository so that it returns a collection of one room
  var fakeRooms = Substitute.For<IRepository<Room>>();
  var fakeRoomsQueryable = new[]{new Room()}.AsQueryable();
  fakeRooms.GetAll<Room>().Returns(fakeRoomsQueryable);
  // connect UOW with room repository
  fakeUOW.Rooms.Returns(fakeRooms);
  var controller = new LookupsController(fakeUOW);
  var result = controller.GetRooms().Any();
  Assert.IsTrue(result);
}

请考虑阅读《单元测试的艺术》,这是一本了解单元测试的好书。