如何对控制器进行单元测试?

时间:2016-01-26 16:23:20

标签: asp.net asp.net-mvc unit-testing

我在ASP.NET Mvc 6中有控制器。

    public class VendorManagementController : Controller
    {
        private readonly IVendorRespository _vendorRespository;

        public VendorManagementController(IVendorRespository vendorRespository)
        {
            _vendorRespository = vendorRespository;
        }

        [Microsoft.AspNet.Mvc.HttpGet]
        public dynamic GetVendorById(int pkey)
        {
            Vendor vendor = _vendorRespository.GetVendor(pkey);
            return vendor;
        }

        // GET 
        // USing JqGrid
        [Microsoft.AspNet.Mvc.HttpGet]
        public dynamic GetVendors(string sidx, string sortOrder, int page, int rows, int pkey)
        {
            var vendors = _vendorRespository.GetAllVendors().AsQueryable();
            var pageIndex = Convert.ToInt32(page) - 1;
            var pageSize = rows;
            var totalRecords = vendors.Count();
            var totalPages = (int)Math.Ceiling((float)totalRecords / (float)pageSize);
            return something
        }

        // POST
        [System.Web.Http.HttpPost]
        public string PostVendor(Vendor item)
        {
             _vendorRespository.AddVendor(item);
        }

link提供了测试控制器的示例,但它使用HttpRequestMessage。它不适合我的情况。

所以如果我想测试返回供应商,怎么样? 说我有方法:

 [Fact]
    public void GetAllVendors_ShouldReturnAllVendors()
    {
        var testVendors = GetTestVendors();
        var vendorRespository = new VendorRespository();
        var controller = new VendorManagementController(vendorRespository);
    }

事情是

    var vendors = _vendorRespository.GetAllVendors().AsQueryable();

来自数据库,如何使用我的假供应商模拟它?

修改

该方法返回动态类型,我无法获取列表的Count。 image

1 个答案:

答案 0 :(得分:1)

从nuget - use one of these strategies安装模拟框架,例如Moq。

using Moq;

[Fact]
public void GetAllVendors_ShouldReturnAllVendors()
{
    var testVendors = GetTestVendors();
    var vendorRespository = new Mock<IVendorRepository>();
    vendorRepository.Setup(m => m.GetAllVendors()).Returns(new List<Vendor> { new Vendor() }); // Guessing a bit on return types
    var controller = new VendorManagementController(vendorRespository.Object);

    var result = controller.GetVendors( ... )

    // Assert you get 1 Vendor back, not sure what you're planning to return by "something". :-)
}

其他框架可用,NSubsititute,FakeItEasy