使用Json返回对Web API进行单元测试

本文关键字:单元测试 API Web Json 返回 使用 | 更新日期: 2023-09-27 18:07:20

我是全新的单元测试,我需要为当前的项目这样做。我有很多测试模型类和MVC控制器的例子,但我有几个web API控制器有一个Json返回,我需要进行单元测试。我应该用这些测试什么,我该怎么做?

第一个不带参数的例子

public class DefaultController : ApiController
{
    private TestEntities db = new TestEntities();
    [AcceptVerbs("GET")]
    public IHttpActionResult FirstAPI()
    {
        var myQuery = (from p in db.Participants
                       select new
                            {
                                p.ID,
                                p.Name,
                                p.MemberType
                            });
        return Json(myQuery);
    }
}

第二个接受两个参数的例子

public class DefaultController : ApiController
{
    private TestEntities db = new TestEntities();
    [AcceptVerbs("GET")]
    public IHttpActionResult SecondAPI(int id, string name)
    {
        var myQuery = (from p in db.Participants
                       where p.ID == id && p.Name == name
                       select new
                            {
                                p.ID,
                                p.Name,
                                p.MemberType
                            });
        return Json(myQuery);
    }
}

使用Json返回对Web API进行单元测试

你应该像测试其他东西一样对它进行单元测试…调用它并检查结果。在本例中,结果类型为HttpActionResult,它似乎只有一个操作。

因此,您的测试可能还需要调用操作,可能等待它,因为它是async,并检查的结果,它似乎是HttpResponseMessage类型。

类型具有您可以检查的属性,以验证您正在测试的操作的结果。最重要的属性可能是Content,它包含响应的内容。您的测试将基本上读取这些内容,并根据预期结果验证它们。


这里的更大的问题实际上并不是验证结果,只要您像上面描述的那样查看返回值,这就很容易了。单元测试的真正问题是:

private TestEntities db = new TestEntities();

您的控制器与依赖项紧密耦合。除非您在依赖项中有适当的mock设置,否则您的单元测试也将与该依赖项紧密耦合。

抽象接口背后的依赖,并使用依赖注入来解耦你的控制器是强烈推荐的。这样,您的单元测试就可以提供具有已知的、可预测行为的模拟依赖项。

下面的代码运行得很好:

var result = controller.Test(expectedArg) as JsonResult<MyClass>;
Assert.AreEqual(expectedResult, result.Content);