Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CollectionAssert.AreNotEqual,即使我正在重置控制器中的值_C#_Asp.net Mvc_Unit Testing - Fatal编程技术网

C# CollectionAssert.AreNotEqual,即使我正在重置控制器中的值

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

我是C#新手,正在努力学习单元测试。我有一个单元测试,它为一个猜测游戏设置一个猜测列表,并将它们存储在会话中。但是,单元测试失败

我的单元测试:

[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);