C# 如何对使用HttpClient的MVC控制器操作进行单元测试

C# 如何对使用HttpClient的MVC控制器操作进行单元测试,c#,asp.net-mvc,asp.net-mvc-4,unit-testing,asp.net-web-api,C#,Asp.net Mvc,Asp.net Mvc 4,Unit Testing,Asp.net Web Api,我正在尝试测试以下MVC控制器操作,它调用Web API获取产品列表: public ActionResult Index() { var model = new List<Product>(); using(HttpClient client = new HttpClient()) { model = client.GetAsync(uri).Result.Content.ReadAsAsync<List<Product>

我正在尝试测试以下MVC控制器操作,它调用Web API获取产品列表:

public ActionResult Index()
{
    var model = new List<Product>();

    using(HttpClient client = new HttpClient())
    {
        model = client.GetAsync(uri).Result.Content.ReadAsAsync<List<Product>>().Result;
    }

    return View(model);
}
public ActionResult Index()
{
var模型=新列表();
使用(HttpClient=new HttpClient())
{
model=client.GetAsync(uri).Result.Content.ReadAsAsync().Result;
}
返回视图(模型);
}
我正在尝试对此进行单元测试,并尝试使用Telerik JustMock进行测试,例如:

[TestMethod]
    public void IndexDisplaysAllProducts()
    {                                       // Not sure how to call here
        var repo = Mock.Arrange(() => (new List<Product>())).Returns(
                new List<Product> { 
                    new Product(), 
                    new Product(), 
                    new Product()
                });

        var controller = new ProductsController();

        var result = (ViewResult)controller.Index();
        var model = (List<Product>)result.Model;

        Assert.AreEqual(3, model.Count);
    }
[TestMethod]
public void IndexDisplaysAllProducts()
{//不知道怎么打电话到这里
var repo=Mock.Arrange(()=>(new List())。返回(
新列表{
新产品(),
新产品(),
新产品()
});
var controller=新产品控制器();
var result=(ViewResult)controller.Index();
var模型=(列表)result.model;
Assert.AreEqual(3,model.Count);
}

我只是想知道你将如何测试这个?

移动atm,请原谅我的简短。实现httpclientfactory类和Ihttpclientfactory接口,使用ioc将其注入到ctor,然后在测试期间进行模拟,以创建http客户端的模拟实例

或者,甚至更简单的测试方法是,您可以使用这种方法来实现一个工厂类,用于完成您使用http客户机进行的所有工作(GetAsync(uri).Result.Content.ReadAsAsync>()等)


Hth

将HttpClient抽象出来。在测试中,IoC将用一个受控的模拟来替换该类。如果不需要测试与HttpClient相关的代码,您也可以在一个*Impl方法中拆分操作