Asp.net mvc 测试从API端点获取数据的Mvc控制器

Asp.net mvc 测试从API端点获取数据的Mvc控制器,asp.net-mvc,api,unit-testing,nunit,moq,Asp.net Mvc,Api,Unit Testing,Nunit,Moq,我正在从事一个从API端点获取数据的Web项目。API层位于服务层的顶部,存储库层位于底部。我已经为服务层和API层编写了单元测试。我使用Moq框架来模拟依赖项。 现在我想测试MVC控制器。我使用一个从HttpClient派生的请求管理器类从API端点获取数据。那么我如何测试这个控制器呢。我已经编写了一个单元测试,但是该测试直接从我的数据库获取数据 public class UserController : Controller { private RequestManager req

我正在从事一个从API端点获取数据的Web项目。API层位于服务层的顶部,存储库层位于底部。我已经为服务层和API层编写了单元测试。我使用Moq框架来模拟依赖项。 现在我想测试MVC控制器。我使用一个从HttpClient派生的请求管理器类从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>);
    }
}
公共类UserController:Controller
{
private RequestManager RequestManager=new RequestManager();
//获取:用户
公共异步任务索引()
{
List alluser=wait requestManager.GetUsers();
如果(allUsers==null)
{
抛出新的HttpException(404,“未找到用户”);
}
返回视图(Alluser);
}
}
公共类UserControllerTest
{
公共用户控制器;
[一次性设置]
公共void InIt()
{
控制器=新用户控制器();
}
[测试]
公共异步任务TestIndex()
{
var view=await controller.Index()作为ActionResult;
断言(视图是ViewResult);
Assert.That(view.Model是List);
}
}
试试这个

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>);
    }
}
公共类UserController:Controller
{
private RequestManager RequestManager=new RequestManager();
Mock mockRepository=new Mock();
Mock mockUserViewModel=new Mock();
ViewResult ViewResult;
//获取:用户
公共异步任务索引()
{
List alluser=wait requestManager.GetUsers();
如果(allUsers==null)
{
抛出新的HttpException(404,“未找到用户”);
}
返回视图(Alluser);
}
}
公共类UserControllerTest
{
公共用户控制器;
[一次性设置]
公共void InIt()
{
控制器=新用户控制器();
}
[测试]
公共异步任务TestIndexWhenallUserSnall()时
{
var view=await controller.Index()作为ActionResult;
List listofusermodel=新列表();
//在列表中添加一些虚拟数据,这样它就不会直接从数据库中获取数据
mockRepository.Setup(x=>requestManager.GetUsers()).Returns(listofusermodel);
断言(视图是ViewResult);
Assert.That(view.Model是List);
}
}
试试这个

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>);
    }
}
公共类UserController:Controller
{
private RequestManager RequestManager=new RequestManager();
Mock mockRepository=new Mock();
Mock mockUserViewModel=new Mock();
ViewResult ViewResult;
//获取:用户
公共异步任务索引()
{
List alluser=wait requestManager.GetUsers();
如果(allUsers==null)
{
抛出新的HttpException(404,“未找到用户”);
}
返回视图(Alluser);
}
}
公共类UserControllerTest
{
公共用户控制器;
[一次性设置]
公共void InIt()
{
控制器=新用户控制器();
}
[测试]
公共异步任务TestIndexWhenallUserSnall()时
{
var view=await controller.Index()作为ActionResult;
List listofusermodel=新列表();
//在列表中添加一些虚拟数据,这样它就不会直接从数据库中获取数据
mockRepository.Setup(x=>requestManager.GetUsers()).Returns(listofusermodel);
断言(视图是ViewResult);
Assert.That(view.Model是List);
}
}

您应该将控制器和管理器解耦。从
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);
    }
}
公共类UserController:Controller
{
私人RequestManager _RequestManager;
公共用户控制器(IRequestManager请求管理器)
{
_requestManager=requestManager;
}
//获取:用户
公共异步任务索引()
{
List alluser=wait_requestManager.GetUsers();
如果(allUsers==null)
{
抛出新的HttpException(404,“未找到用户”);
}
返回视图(Alluser);
}
}
然后在单元测试中,您可以模拟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>);
    }
}
公共类UserControllerTest
{
[测试]
公共异步任务TestIndex()
{
//安排
Mock requestManager=new Mock();
//在这里设置您想要的。。。
UserController sut=newusercontroller(requestManager.Object);//建议为此使用AutoMoqer。
//表演
var view=wait sut.Index()作为ActionResult;
//断言
断言(视图是ViewResult);
Assert.That(view.Model是List);
}
}

您应该将控制器和管理器解耦。从
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);
    }
}
公共类UserController:Controller
{
私人RequestManager _RequestManager;
公共用户控制器(IRequestManager请求管理器)
{
_requestManager=requestManager;
}
//获取:用户
公共异步任务索引()
{
List alluser=wait_requestManager.GetUsers();
如果(allUsers==null)
{
抛出新的HttpException(404,“未找到用户”);
}
返回视图(Alluser);
}
}
然后在单元测试中,您可以模拟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>);
    }
}
公共类UserControllerTest
{
[测试]
公共异步任务TestIndex()
{
//安排
Mock requestManager=new Mock();
//在这里设置您想要的。。。
UserController sut=newusercontroller(requestManager.Object);//建议为此使用AutoMoqer。
//表演
var view=wait sut.Index()作为ActionResult;
//断言
断言(视图是ViewResult);
Assert.That(view.Model是List);
}
}
<