测试从 API 端点获取数据的 Mvc 控制器

Testing a Mvc controller that gets data from an API endpoint

我正在开发一个从 API 端点获取数据的 Web 项目。 API 层位于服务层之上,存储层位于底部。我已经为服务和 API 层编写了单元测试。我正在使用 Moq 框架来模拟依赖项。 现在我想测试 MVC 控制器。我正在使用派生自 HttpClient 的请求管理器 class 从 API 端点获取数据。那么我该如何测试这个控制器。我已经编写了一个单元测试,但该测试是直接从我的数据库中获取数据。

 public class UserController : Controller
{
    private RequestManager requestManager = new RequestManager();
    // GET: User
    public async Task<ActionResult> Index()
    {
        List<UserViewModel> allUsers = await requestManager.GetUsers();

        if(allUsers == null)
        {
            throw new HttpException(404, "No Users Found");
        }

        return View(allUsers);
    }
}

public class UserControllerTest
{
    public UserController controller;

    [OneTimeSetUp]
    public void InIt()
    {
        controller = new UserController();
    }
    [Test]
    public async Task TestIndex()
    {
        var view = await controller.Index() as ActionResult;
        Assert.That(view is ViewResult);
        Assert.That(view.Model is List<UserViewModel>);
    }
}

试试这个..

public class UserController : Controller
{
    private RequestManager requestManager = new RequestManager();
    Mock<RequestManager> mockRepository = new Mock<RequestManager>();
    Mock<UserViewModel> mockUserViewModel = new Mock<UserViewModel>();
    ViewResult viewResult;

    // GET: User
    public async Task<ActionResult> Index()
    {
        List<UserViewModel> allUsers = await requestManager.GetUsers();

        if(allUsers == null)
        {
            throw new HttpException(404, "No Users Found");
        }

        return View(allUsers);
    }
}

public class UserControllerTest
{
    public UserController controller;

    [OneTimeSetUp]
    public void InIt()
    {
        controller = new UserController();
    }
    [Test]
    public async Task TestIndexWhenAllUsersNULL()
    {
        var view = await controller.Index() as ActionResult;
        List<mockUserViewModel> listofusermodel =  new List<mockUserViewModel>();
        //add some dummy data in your List so it will not getting data directly from your Database 
        mockRepository.Setup(x => requestManager.GetUsers()).Returns(listofusermodel);
        Assert.That(view is ViewResult);
        Assert.That(view.Model is List<mockUserViewModel>);
    }
}

你应该解耦控制器和管理器。从 RequestManager 中提取接口并将其注入控制器。这应该不是问题,Ioc 容器可以为您做到这一点。

public class UserController : Controller
{
    private RequestManager _requestManager;

    public UserController(IRequestManager requestManager)
    {
        _requestManager = requestManager;
    }

    // GET: User
    public async Task<ActionResult> Index()
    {
        List<UserViewModel> allUsers = await _requestManager.GetUsers();

        if(allUsers == null)
        {
            throw new HttpException(404, "No Users Found");
        }

        return View(allUsers);
    }
}

然后在您的单元测试中您可以模拟 IRequestManager。

public class UserControllerTest
{
    [Test]
    public async Task TestIndex()
    {
        //arrange
        Mock<IRequestManager> requestManager = new Mock<IRequestManager>();
        //setup what you want here...
        UserController sut = new UserController(requestManager.Object);//suggest to use AutoMoqer for this.

        //act
        var view = await sut.Index() as ActionResult;

        //assert
        Assert.That(view is ViewResult);
        Assert.That(view.Model is List<UserViewModel>);
    }
}