如何编写Web API Controller的单元测试

3
我正在探索JohnPapa在Github上的CodeCamper项目https://github.com/johnpapa/CodeCamper。这是一个ASP.Net SPA应用程序,我也正在开发类似的项目。
我希望为WebAPI控制器编写一些UnitTests。控制器构造函数需要UnitofWork实例,并且UnitofWork在Application_Start方法中初始化。
当我运行我的UnitTest项目时,UnitofWork对象为空。我该如何从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 存储库。https://github.com/johnpapa/CodeCamper


你可以使用像Moq这样的Mock框架为UoW接口创建一个新的mock实例,并将该mock实例传递给控制器。 - Pablo Cibraro
1个回答

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);
}

建议阅读 单元测试的艺术 这本书,它是学习单元测试的好书。


现在我有一个UnitOfWork的实例,这很好,但是Uow.Rooms始终返回零(0)。但是当我通过应用程序使用相同的方法时,它会返回所有房间。为什么? - Mohsin JK
你想要添加什么和在哪里添加? - meilke
@meike,我可以把我的应用程序发给你吗?这样你就可以轻松地通知我问题了。 - Mohsin JK
当然。你能在我的账户上看到我的电子邮件吗? - meilke
你的计划是什么?谁给谁发送什么? - meilke
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接