gpt4 book ai didi

c# - 如何对采用对象数组并在 ASP.Net MVC 中返回 JsonResult 的 Action 方法进行单元测试

转载 作者:太空宇宙 更新时间:2023-11-03 15:26:18 25 4
gpt4 key购买 nike

我正在尝试在 Visual C# Unit Test 项目中编写单元测试。

我传递了一个空的 ArrayFrame 类,它返回一个 JSON 对象。

    [HttpPost]
public JsonResult SubmitBowlingScore(Frame[] frames)
{
int totalScore= 0;
var objScore = new EngineService();

for (int i = 0; i < frames.Length; i++)
{
Boolean wasSpare = false;

if (i > 0 && objScore.IsSpare(frames[i-1]))
{
wasSpare = true;
}
totalScore += objScore.CalculateScore(frames[i], wasSpare);
}

return Json("{\"score\":"+ totalScore + "}");
}

希望通过以下条目进行测试:但不知道如何!!!

 [{""1stRoll"":2,""2ndRoll"":2 ,""3rdRoll"":0},
{""1stRoll"":4,""2ndRoll"":8 ,""3rdRoll"":0},
{""1stRoll"":6,""2ndRoll"":2 ,""3rdRoll"":0}];

对于以下单元测试,我们将不胜感激任何帮助/想法/建议。 SubmitBowlingScore() 如何将 Frame [] 数据作为参数?

    [TestMethod]
public void SubmitBowlingScore()
{
//Arrange
HomeController controller = new HomeController();
//Act
JsonResult result = controller.SubmitBowlingScore(**What goes here???**) as JsonResult;

//Assert
Assert.IsNotNull(JsonResult, "No JsonResult returned from action method.");
Assert.AreEqual(@"{[{""1stRoll"":""2"",""2ndRoll"":2 ,""3rdRoll"":0},{""1stRoll"":""2"",""2ndRoll"":8 ,""3rdRoll"":0},{""1stRoll"":""6"",""2ndRoll"":2 ,""3rdRoll"":0}],""Count"":3,""Success"":true}",
result.Data.ToString());
}

最佳答案

您将业务逻辑与表示逻辑混合在一起。您应该将 Controller 方法的整个主体移动到一个根据帧计算分数的对象。一旦你得到了它,就没有什么可以在 Controller 中测试了(除非你不信任 MVC 框架..)

我对您的 Frame 模型的再现:

public class Frame
{
public int FirstRoll { get; set; }
public int SecondRoll { get; set; }
public int ThirdRoll { get; set; }
}

这里是作为扩展的业务逻辑。您可能希望将其分解为自己的类,或者可能使其成为您的 EngineService 类的成员。

public static class FrameExtensions
{
public static int SumFrameScores(this Frame[] frames)
{
//break out early if no frames have been recorded
if (frames.Length == 0) return 0;

int totalScore = 0;
var objScore = new EngineService();

for (int i = 0; i < frames.Length; i++)
{
bool wasSpare = objScore.IsSpare(frames[i - 1]);
totalScore += objScore.CalculateScore(frames[i], wasSpare);
}

return totalScore;
}
}

当您进行测试时,您可以直接针对您的 C# 类/类型进行测试,因此您无需担心 JSON/表示层数据转换。

[TestMethod]
public void SubmitBowlingScore()
{
//Arrange
var frames = new Frame[]
{
new Frame {FirstRoll = 2, SecondRoll = 2, ThirdRoll = 0},
new Frame {FirstRoll = 2, SecondRoll = 6, ThirdRoll = 0},
new Frame {FirstRoll = 0, SecondRoll = 9, ThirdRoll = 0}
};
//Act
var score = frames.SumFrameScores();

//Assert
Assert.AreEqual(21, score);
}

最后,您的 Controller 将简化为以下内容:

[HttpPost]
public JsonResult SubmitBowlingScore(Frame[] frames)
{
var finalScore = frames.SumFrameScores();
return Json(new { score = finalScore });
}

关于c# - 如何对采用对象数组并在 ASP.Net MVC 中返回 JsonResult 的 Action 方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35190872/

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