使用 Xunit 测试 asp.net 核心 2.0 项目如何测试 httpget

Testing asp.net core 2.0 project with Xunit how to test httpget

我有一个 asp.net 核心 2.0 项目,我正在 Visual Studio 2017 年构建。我正在通过测试 asp.net 核心项目来学习技巧,但我正在想知道如何在我的控制器中测试 HHTTPGET 方法。
下面是我的初始控制器。

public class ValuesController : Controller
{
    private Config MyConfig { get; }

    private Solr Solr { get; }

    private Voyager Voyager { get; }

    private Messages Messages { get; }

    public ValuesController(Config config, Solr solr, Voyager voyager, Messages messages)
    {
        MyConfig = config;
        Solr = solr;
        Voyager = voyager;
        Messages = messages;
    }

    // GET api/values
    [HttpGet]
    [Route("/api/[Controller]")]
    public IEnumerable<string> Get()
    {
        string version = ".NET Framework: " + Environment.Version.ToString();
        string vers = "ASP.NET Core Framework: " + typeof(Controller).Assembly.GetName().Version.ToString();
        return new string[] { version, vers };
    }

    [HttpGet]
    [Route("/api/[Controller]/config")]
    public JsonResult GetConfig()
    {
        return new JsonResult(MyConfig);
    }

    [HttpGet]
    [Route("/api/[Controller]/solr")]
    public JsonResult GetSolr()
    {
        return new JsonResult(Solr);
    }

    [HttpGet]
    [Route("/api/[Controller]/voyager")]
    public JsonResult GetVoyager()
    {
        return new JsonResult(Voyager);
    }

    [HttpGet]
    [Route("/api/[Controller]/messages")]
    public JsonResult GetMessages()
    {
        return new JsonResult(Messages);
    }

只是想知道是否有人可以举例说明如何测试这些路由或 HTTPGets...

所以我发现第一步是设置一个有点通用的模拟连接,所以我创建了一个方法来通过下面的方法模拟到服务器的连接。

    private CollectionsController SetupController()
    {
        if (controller != null)
        {
            controller = null;
        }
        if (controllerContext != null)
        {
            controllerContext = null;
        }
        controller = new CollectionsController();
        controller.ControllerContext = new ControllerContext();
        controllerContext = controller.ControllerContext;
        controllerContext.HttpContext = new DefaultHttpContext();
        //The header below is generic don't really care what the device id is
        controllerContext.HttpContext.Request.Headers["device-id"] = "20317";

    }

然后作为示例,我在下面设置了一个测试,它只检查状态代码并断言从控制器返回的对象不为空。

    [Fact]
    public void TestPostCollectionName()
    {
        valData = new ValData();
        valData.value = "NewObject";
        controller = SetupController();
        var results = controller.PostCollectionName(valData, testCollecName);
        Assert.NotNull(results);
        Assert.True(controllerContext.HttpContext.Response.StatusCode == 200);

    }