如何在MSTest中对JsonResult和集合进行单元测试

mit*_*daa 26 asp.net-mvc unit-testing mstest

即使我已经编码了很长时间,我对单元测试也很陌生.我想把它作为我发展方式的一部分.我遇到了关于如何对集合进行单元测试的问题.我通常有我的jQuery脚本调用ASP.Net Server方法来获取数据和填充表格等.他们看着像是

Get_*Noun*() 
Run Code Online (Sandbox Code Playgroud)

通常返回一个JsonResult.关于使用MSTest进行单元测试的测试方法和方法的任何想法?

Dav*_*tka 52

您应该能够像其他任何东西一样测试它,前提是您可以从JsonResult中提取值.这是一个帮助你的帮手:

private T GetValueFromJsonResult<T>(JsonResult jsonResult, string propertyName)
{
    var property =
        jsonResult.Data.GetType().GetProperties()
        .Where(p => string.Compare(p.Name, propertyName) == 0)
        .FirstOrDefault();

    if (null == property)
        throw new ArgumentException("propertyName not found", "propertyName");
    return (T)property.GetValue(jsonResult.Data, null);
}
Run Code Online (Sandbox Code Playgroud)

然后像往常一样调用控制器,并使用该帮助程序测试结果.

var jsonResult = yourController.YourAction(params);
bool testValue = GetValueFromJsonResult<bool>(jsonResult, "PropertyName");
Assert.IsFalse(testValue);
Run Code Online (Sandbox Code Playgroud)

  • @MarkFreedman"不完全适合测试传输格式的结果"您对此声明有任何参考或来源吗? (7认同)

Jaf*_*fin 20

(我使用的是NUnit语法,但MSUnit不应该太远)

您可以像这样测试您的JsonResult:

var json = Get_JsonResult()
dynamic data = json.Data;
Assert.AreEqual("value", data.MyValue)
Run Code Online (Sandbox Code Playgroud)

然后在包含要测试的代码的项目中,编辑AssemblyInfo.cs文件以允许测试程序集访问匿名类型:

[assembly: InternalsVisibleTo("Tests")]
Run Code Online (Sandbox Code Playgroud)

这样动态就可以确定从json.Data值返回的匿名对象的类型;

  • 只是为了澄清:[assembly:InternalsVisibleTo("TestProjectNamespace")]应该在MVC AssemblyInfo.cs项目中设置. (4认同)