作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的任务是为以下 Web API 2 操作编写单元测试:
public HttpResponseMessage Get()
{
IEnumerable<KeyValuePair<long, string>> things = _service.GetSomething();
return ActionContext.Request.CreateResponse(things.Select(x => new
{
Thing1 = x.Prop1.ToString(),
Thing2 = x.Prop2
}).ToArray());
}
我正在测试状态代码并且工作正常,但我无法弄清楚如何提取内容数据并对其进行测试。到目前为止,这是我的测试:
[TestMethod]
public void GetReturnsOkAndExpectedType()
{
var controller = GetTheController();
var response = controller.Get();
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
dynamic responseContent;
Assert.IsTrue(response.TryGetContentValue(out responseContent));
//???? How can I cast/convert responseContent here ????
}
如果我调试测试并在即时窗口中检查 responseContent
,我会看到这个(我已经模拟/存入了一个用于测试的假值):
{<>f__AnonymousType1<string, string>[1]}
[0]: { Thing1 = "123", Thing2 = "unit test" }
我可以将其转换为一个对象数组,但是如果我尝试通过它们的属性名称提取值,我会得到一个错误(再次是立即窗口):
((object[])responseContent)[0].Thing1
'object' does not contain a definition for 'Thing1' and no extension method 'Thing1' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)
同样,如果我尝试转换和投影到相同形状的匿名类型,它不会编译:
//Thing1 and Thing2 get red-lined here as 'cannot resolve symbol'
var castResult = ((object[]) responseContent).ToList().Select(x => new {x.Thing1, x.Thing2});
我知道如果我使用 JsonConvert
之类的东西序列化/反序列化所有内容,我可能可以实现我想做的事情,但这似乎不是“正确”的做法。我觉得我在这里缺少一些基本的东西。如何从 HttpResponseMessage
转换/转换匿名类型以进行单元测试?
最佳答案
正如@Daniel J.G 所说。在上面的评论中,一种选择是使用反射来获取属性的值。由于您似乎正在使用 MS 测试框架,另一种选择是使用 PrivateObject类为您做一些反射(reflection)工作。
所以,你可以在你的测试中做这样的事情:
var poContent = ((object[])responseContent).Select(x => new PrivateObject(x)).ToArray();
Assert.AreEqual("123", poContent[0].GetProperty("Thing1"));
Assert.AreEqual("unit test", poContent[0].GetProperty("Thing2"));
关于unit-testing - 如何从 HttpResponseMessage 转换/转换匿名类型以进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30624938/
我是一名优秀的程序员,十分优秀!