C# CollectionAssert.AreNotEqual,即使我正在重置控制器中的值
我是C#新手,正在努力学习单元测试。我有一个单元测试,它为一个猜测游戏设置一个猜测列表,并将它们存储在会话中。但是,单元测试失败 我的单元测试:C# CollectionAssert.AreNotEqual,即使我正在重置控制器中的值,c#,asp.net-mvc,unit-testing,C#,Asp.net Mvc,Unit Testing,我是C#新手,正在努力学习单元测试。我有一个单元测试,它为一个猜测游戏设置一个猜测列表,并将它们存储在会话中。但是,单元测试失败 我的单元测试: [TestMethod] public void StartNewGameCausesANewTargetInTheGuessingGameGameStoredInSessionState() { //Arrange var theGame = new GuessingGame(); List<int> origin
[TestMethod]
public void StartNewGameCausesANewTargetInTheGuessingGameGameStoredInSessionState()
{
//Arrange
var theGame = new GuessingGame();
List<int> originalTarget = new List<int>(theGame.Target);
var theContext = new FakeHttpContext();
var theKey = "GameState";
theContext.Session.Add(theKey, theGame);
var controller = new Exercise09Controller();
var request = new System.Web.Routing.RequestContext(theContext, new System.Web.Routing.RouteData());
controller.ControllerContext = new System.Web.Mvc.ControllerContext(request, controller);
//Act
controller.StartNewGame();
//Assert
Assert.IsInstanceOfType(controller.Session[theKey], typeof(GuessingGame));
CollectionAssert.AreNotEqual(originalTarget, theGame.Target);
}
我担心这个问题是由我的GuessingGame构造函数引起的,因为它将目标设置为
List(){1,2,3}
,而这不会被覆盖。我如何创建不同整数的新列表,然后将它们设置为我的会话?问题在于,在单元测试中,您使用了一个局部变量进行比较。您应该将第二个断言重写为:
var sessionGame = controller.Session[theKey] as GuessingGame;
CollectionAssert.AreNotEqual(originalTarget, sessionGame.Target);
您的控制器没有使用游戏
,它正在创建自己的猜测游戏
实例,并相应地设置会话变量。您的第一个断言表明您理解这一点,但您只是没有理解控制器正在使用的类的哪个实例
我相信您会意识到,在生成随机数时,两个列表集合的内容仍然可能相同
public RedirectToRouteResult StartNewGame()
{
var count = 4;
var random = new Random();
var result = new List<int>();
for (var i = 0; i < count; i++)
{
var swap = random.Next(1, 9);
if (!result.Contains(swap))
{
result.Add(swap);
}
// need to create a new random in generator
}
this.Session["GameState"] = new GuessingGame() { Target = result };
return RedirectToRoute(new
{
controller = "Index",
action = "Index"
});
}
var sessionGame = controller.Session[theKey] as GuessingGame;
CollectionAssert.AreNotEqual(originalTarget, sessionGame.Target);