【发布时间】:2023-04-03 19:21:01
【问题描述】:
我正在我的一个控制器中对一种方法进行单元测试,以检查 Linq 查询是否返回了正确的数据(这可能是一个集成测试,但问题仍然存在)。
我试图通过在测试中复制运行时遇到的任何错误,然后在代码中修复它,尽可能地遵循 TTD。
但是,我遇到了一个错误,该错误仅在我的应用程序的运行时执行期间发生而不是在我的测试期间发生。
我在运行时遇到的异常是:
抛出异常:Newtonsoft.Json.dll 中的“System.NotSupportedException”
附加信息:LINQ to Entities 无法识别方法“System.String ToLowerInvariant()”方法,并且该方法无法转换为存储表达式。
被测方法为:
[HttpGet]
public ActionResult GetRegions(string term)
{
var regions = from region in DbContext.Culture
where
!region.NeutralCultureFlag &&
(term == null || (region.NativeName + region.CultureCode).ToLowerInvariant().Contains(term.ToLowerInvariant()))
orderby region.Name
select region;
return Json(regions.Select(x => new
{
id = x.CultureId,
text = x.NativeName + " (" + x.CultureCode + ")"
})
);
}
该错误的修复显然是将(region.NativeName + region.CultureCode).ToLowerInvariant() 更改为(region.NativeName.ToLowerInvariant() + region.CultureCode.ToLowerInvariant()),但我想在修复它之前在我的测试中得到这个错误。
我的测试方法是:
public void Test1(string term, int expectedCount)
{
var result = _controller.GetRegions(term);
Assert.IsType(typeof (JsonNetResult), result);
var jsonResult = (JsonNetResult)result;
var data = GetJsonObject<List<JsonData>>(jsonResult);
}
JsonNetResult 是一个自定义类,它扩展了普通的JsonResult,因此我可以使用 Json.Net 而不是标准的 Json 序列化器。
JsonNetResult 中的ExecuteResult 方法看起来像:
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context");
HttpResponseBase response = context.HttpContext.Response;
response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;
if (this.ContentEncoding != null)
response.ContentEncoding = this.ContentEncoding;
if (this.Data == null)
return;
var scriptSerializer = JsonSerializer.Create(this.Settings);
using (var sw = new StringWriter())
{
scriptSerializer.Serialize(sw, this.Data); //error occurs here
response.Write(sw.ToString());
}
}
异常发生在scriptSerializer.Serialize(sw, this.Data);。
有没有办法在我的单元测试中复制错误,以便我可以确保它按照 TTD 原则正确修复?
【问题讨论】:
-
您的测试是否连接到与您的生产相同类型的数据库?
-
我的测试设置为使用模拟的
DbContext。 -
在这种情况下,正确测试它的唯一方法是拥有一个连接到测试数据库的非模拟上下文 - 因为该错误专门在 @ 987654332@ ->
SQL statement发电机
标签: c# json linq unit-testing