Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何对返回匿名对象数组的JsonResult进行单元测试?_Asp.net Mvc_Json_Unit Testing - Fatal编程技术网

Asp.net mvc 如何对返回匿名对象数组的JsonResult进行单元测试?

Asp.net mvc 如何对返回匿名对象数组的JsonResult进行单元测试?,asp.net-mvc,json,unit-testing,Asp.net Mvc,Json,Unit Testing,我有一个操作返回匿名对象的json数组: public JsonResult GetItems() { var items = new[] { new { Id = 1, Name = "One" }, new { Id = 2, Name = "Two" } }; return Json(items); } 如何为该方法编写测试?大概是这样的: [TestMethod] public void MyController_GetItems() { var control

我有一个操作返回匿名对象的json数组:

public JsonResult GetItems()
{
    var items = new[] { new { Id = 1, Name = "One" }, new { Id = 2, Name = "Two" } };
    return Json(items);
}
如何为该方法编写测试?大概是这样的:

[TestMethod]
public void MyController_GetItems()
{
    var controller = new MyController();
    var result = controller.GetItems();
    dynamic items = result.Data;
    Assert.AreEqual("One", items[0].Name); // ???
}

那么,返回类型仍然是
JsonResult
。如果你翻阅文档,应该有一种方法来检查它的值


看起来你得到的只是一个
对象
类型。所以,我认为你所做的是你能做的最好的事情。

像这样的事情怎么样:
var items = (dynamic[])result.Data;
Assert.AreEqual("One", items[0].Name);
JsonNetResult是一个自定义ActionResult,它将内部Microsoft Json序列化程序替换为Json.net

using FakeItEasy;
using Newtonsoft.Json;
using NUnit.Framework;
using System;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

public class JsonNetResultFixture
{
    private JsonNetResult _sut;

    private Controller fakeController;
    private HttpContextBase fakeContext;
    private HttpRequestBase fakeRequest;
    private HttpResponseBase fakeResponse;
    private RequestContext fakeRequestContext;

    [SetUp]
    public void Setup()
    {
        fakeController = A.Fake<Controller>();
        fakeContext = A.Fake<HttpContextBase>();
        fakeRequest = A.Fake<HttpRequestBase>();
        fakeResponse = A.Fake<HttpResponseBase>();
        fakeRequestContext = new RequestContext(fakeContext, new RouteData());
        fakeController.ControllerContext = new ControllerContext(fakeRequestContext, fakeController);

        A.CallTo(() => fakeRequest.HttpMethod).Returns(HttpVerbs.Post.ToString());
        A.CallTo(() => fakeContext.Response).Returns(fakeResponse);
        A.CallTo(() => fakeContext.Request).Returns(fakeRequest);

        _sut = new JsonNetResult();
    }

    [Test]
    [ExpectedException(typeof(ArgumentNullException))]
    public void should_throw_argumentexception_if_context_is_null()
    {
        _sut.ExecuteResult(null);
    }

    [Test]
    public void should_write_serialized_class_to_output_stream()
    {
        //Arrange
        var sb = new StringBuilder();

        _sut.Data = new SerializableClass { Id = Guid.NewGuid(), Payload = "awesome payload" };

        var serializedData = JsonConvert.SerializeObject(_sut.Data, Formatting.Indented);

        A.CallTo(() => fakeResponse.Write(A<String>.Ignored)).Invokes((String x) => sb.Append(x));

        //Act
        _sut.ExecuteResult(fakeController.ControllerContext);

        //Assert
        Assert.That(sb.ToString(), Is.EqualTo(serializedData));
    }

    [Test]
    public void should_write_nothing_when_data_is_nothing()
    {
        //Arrange
        var sb = new StringBuilder();

        A.CallTo(() => fakeResponse.Write(A<String>.Ignored)).Invokes((String x) => sb.Append(x)).MustHaveHappened(Repeated.Never);

        //Act
        _sut.ExecuteResult(fakeController.ControllerContext);

        //Assert
        Assert.That(sb.ToString(), Is.EqualTo(String.Empty));
    }

    [Test]
    public void should_set_content_type_if_sent_in()
    {
        //Arrange
        var contentType = "text/xml";
        _sut.ContentType = contentType;

        //Act
        _sut.ExecuteResult(fakeController.ControllerContext);

        //Assert
        Assert.That(_sut.ContentType, Is.EqualTo(contentType));
    }

    [Test]
    public void should_set_content_encoding_if_sent_in()
    {
        //Arrange
        var contentEncoding = Encoding.BigEndianUnicode;
        _sut.ContentEncoding = contentEncoding;

        //Act
        _sut.ExecuteResult(fakeController.ControllerContext);

        //Assert
        Assert.That(_sut.ContentEncoding, Is.EqualTo(contentEncoding));
    }
}

public class SerializableClass
{
    public Guid Id { get; set; }
    public String Payload { get; set; }
}
使用假货;
使用Newtonsoft.Json;
使用NUnit.Framework;
使用制度;
使用系统文本;
使用System.Web;
使用System.Web.Mvc;
使用System.Web.Routing;
公共类JsonNetResultFixture
{
私人JsonNetResult_sut;
专用控制器;伪控制器;
私有HttpContextBase fakeContext;
私有HttpRequestBase FakerRequest;
私人HttpResponseBase-fakerresponse;
私有RequestContext FakerRequestContext;
[设置]
公共作废设置()
{
fakeController=A.Fake();
fakeContext=A.Fake();
fakeRequest=A.Fake();
fakeResponse=A.Fake();
fakeRequestContext=newrequestcontext(fakeContext,newroutedata());
fakeController.ControllerContext=新的ControllerContext(FakerRequestContext,fakeController);
A.CallTo(()=>fakeRequest.HttpMethod).Returns(HttpVerbs.Post.ToString());
A.CallTo(()=>fakeContext.Response).Returns(fakerresponse);
A.CallTo(()=>fakeContext.Request).Returns(fakeRequest);
_sut=新的JsonNetResult();
}
[测试]
[ExpectedException(typeof(ArgumentNullException))]
如果上下文为null(),则public void应抛出参数异常
{
_sut.executesult(空);
}
[测试]
public void应该将序列化的类写入输出流
{
//安排
var sb=新的StringBuilder();
_sut.Data=new SerializableClass{Id=Guid.NewGuid(),Payload=“awesome Payload”};
var serializedData=JsonConvert.SerializeObject(_sut.Data,Formatting.Indented);
A.CallTo(()=>fakeResponse.Write(A.Ignored)).Invokes((字符串x)=>sb.Append(x));
//表演
_sut.ExecuteSult(fakeController.ControllerContext);
//断言
Assert.That(sb.ToString(),Is.EqualTo(serializedData));
}
[测试]
当数据为空时,public void应该写空
{
//安排
var sb=新的StringBuilder();
A.CallTo(()=>fakeResponse.Write(A.Ignored)).Invokes((String x)=>sb.Append(x)).musthavebefored(Repeated.Never);
//表演
_sut.ExecuteSult(fakeController.ControllerContext);
//断言
Assert.That(sb.ToString(),Is.EqualTo(String.Empty));
}
[测试]
public void应该设置内容类型,如果发送()
{
//安排
var contentType=“text/xml”;
_sut.ContentType=ContentType;
//表演
_sut.ExecuteSult(fakeController.ControllerContext);
//断言
Assert.That(_sut.ContentType,Is.EqualTo(ContentType));
}
[测试]
public void应该设置内容编码,如果发送()
{
//安排
var contentEncoding=Encoding.bigendianucode;
_sut.ContentEncoding=ContentEncoding;
//表演
_sut.ExecuteSult(fakeController.ControllerContext);
//断言
Assert.That(_sut.ContentEncoding,Is.EqualTo(ContentEncoding));
}
}
公共类SerializableClass
{
公共Guid Id{get;set;}
公共字符串有效负载{get;set;}
}

我所看到的一切都是正确的