【问题标题】:UnitTest Method for AJAX JSON Calls to an APIAJAX JSON 调用 API 的 UnitTest 方法
【发布时间】:2012-02-18 22:56:45
【问题描述】:

我正在尝试为 API 的 AJAX 调用编写测试用例。做一个简单的网络请求和响应。我的问题是关于回应的。有没有更简单的方法来提取响应 JSON 值?做这种事情的最好方法是什么?我知道我们可以使用 JQuery,但想使用 Microsoft 测试框架。

    [TestMethod]
    public void TestMethod1()
    {
        string brand = "KEWL";
        string BRAND = "";

        var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://203.135.xx.138:4040/api/v1/subscriptions/signup.format");
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "POST";

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            string json = @"{" +
           " 'api_key': '91230D10-247C-11E1-83FF-9B9C4824019B'," +
           " 'phone': '12122639043', " +
           " 'dob': '11231954', " +
           "      'subscriptions': [ " +
           "                {" +
           "                 'Brand':'" + brand + "', " +
           "                'campaign':'BTLNDN', " +
           "                    'groups':[" +
           "                            {" +
           "                            'group': 'BTLALL'," +
           "                            'subscribed':true" +
           "                            } " +
           "                    ]," +
           "   'lang': 'en' " +
           "                }" +
           "                ] " +
           "   }";

            streamWriter.Write(json);
        }
        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            var responseText = streamReader.ReadToEnd();
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            Dictionary<string, dynamic> dc = serializer.Deserialize<Dictionary<string, dynamic>>(responseText);
            var kev = dc;
            foreach (var key1 in dc.Keys)
            {
               var value3 = dc["ReturnData"]["subscriptions"];
                 BRAND = value3[0]["brand"];
             //   var groups = value3[0]["groups"];
            }


        }
        Assert.AreEqual(brand, BRAND);
    }

【问题讨论】:

  • 哇,单元测试中的 HTTP 请求。单元测试不应该做这样的事情。这看起来更像是一个集成测试。

标签: asp.net json asp.net-mvc-3 unit-testing asp.net-ajax


【解决方案1】:

对 ASP.NET MVC 方法进行单元测试的想法是,您可以在不使用任何 Http 请求或响应功能的情况下运行测试。

假设你有以下方法:

public class MyController : Controller
{
    public ActionResult MyAjax()
    {
        return Json(new { Test = "Test" });
    }
}

您可以使用以下代码对其进行测试:

[TestMethod]
public void MyTest()
{
    MyControllercontroller = new MyController();

    JsonResult json = controller.MyAjax() as JsonResult;

    Assert.IsNotNull(json);

    dynamic data = json.Data;

    Assert.AreEqual("Test", data.Test);
}

要使用动态关键字,您必须确保您的测试项目可以看到您的 Web 项目的内部(这是因为匿名类型被声明为内部的)。您可以通过在您的 Web 项目的 AssemblyInfo.cs 文件中添加:[assembly: InternalsVisibleTo("YourTestProject")] 来做到这一点。

【讨论】:

  • 谢谢——这是一种很好的测试方式,但如果这些是我们让人们从外部访问的外部 API 会怎样。这种测试方法有意义吗?测试路由、外部访问等。是否有理由以这种方式进行测试?
  • @BillPorter 如果你是单元测试,这就是要走的路。许多单元测试将确认您的代码按预期运行。然后,您将只需要一些功能测试来确保一切都按您的预期一起工作。如果这是您的外部 API,您仍然需要确保您的函数按预期运行(单元测试)。
猜你喜欢
  • 1970-01-01
  • 2021-10-14
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 2015-10-08
  • 2015-06-20
相关资源
最近更新 更多