如何为Web API控制器编写UnitTest

时间:2013-09-19 14:24:32

标签: c# asp.net-mvc unit-testing asp.net-web-api unit-of-work

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

我有兴趣为WebAPI控制器编写一些UnitTests。控制器承包商需要UnitofWork instanse,UnitofWork在Application_Start方法中启动。

当我运行UnitTest项目时,UnitofWork对象为null。我如何从UnitTest项目启动UnitofWork,以便我可以运行我的测试方法。我希望能让自己清楚。

以下是跟随控制器的示例UnitTest方法。

LookupsController.cs

UserControllerTest.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

1 个答案:

答案 0 :(得分:3)

使用任何模拟框架为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);
}

请考虑阅读The Art of Unit Testing,这是一本了解单元测试的好书。