gpt4 book ai didi

unit-testing - 如何从 HttpResponseMessage 转换/转换匿名类型以进行单元测试?

转载 作者:行者123 更新时间:2023-12-02 03:25:27 25 4
gpt4 key购买 nike

我的任务是为以下 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com