1

我正在尝试为纸牌游戏应用程序设置单元测试,但我的代码抛出 NullReferenceException: Object reference not set to an instance of an object。据我所知,我不应该收到此错误,但确实存在。

这是我的代码:

        [TestFixture]
        public class Tests
        {
            CardTable aTable = null;

            [SetUp]
            public void setup()
            {
                aTable = new CardTable();
            }


            [Test]
            public void setPlayerGold_setTo0_return0()
            {
                //arrange

                //act
                aTable.setPlayerGold(0);


                //assert
                Assert.AreEqual(0, aTable.playerGold);
            }
       }

       public class CardTable
       {
           int playerGold;

           public CardTable()
           {
               playerGold = 0;
           }


            public void setPlayerGold(int amount)
            {
               if (amount == 0)
               {
                    playerGold = 0;
               }
               else
               {
                   playerGold += amount;
               }
               goldLabel.Text = playerGold + "";
            }

异常被抛出在 aTable.setup 行,好像 aTable 没有被实例化,即使它显然在 [Setup] 中,我不知道为什么。

我正在使用 NUnit 2.6.0.12051 运行 Visual C# 2010 Express v10.0.40219.1 SP1Rel。

任何帮助,将不胜感激。谢谢!

4

3 回答 3

0

启动 NUnit,但不要运行测试。在 Visual Studio 中,确保您打开了包含 nunit 测试的项目。然后在 Visual Studio 中按 ctrl+alt+p。这将显示要附加到的进程列表。选择 nunit-agent.exe 进程。如果有多个 nunit-agent.exe 进程,您可以 ctrl+ 选择所有进程。您可能必须检查所有会话中的显示进程和/或显示所有用户的进程才能显示 nunit-agent.exe。此时您应该能够调试您的测试。

现在您可以在构造函数调用时设置断点CardTable。当您逐步通过调试器时,您应该能够识别您的空对象引用错误。

单步执行代码的另一种方法是在菜单中选择Debug->Exceptions...在显示检查Common Language Runtime Exceptions旁边的抛出框的对话框中。这将导致调试器在抛出任何已处理或未处理的异常时停止。这消除了对断点的需要,但是如果你有被抛出的异常被捕获,它可能比上面的断点方法更麻烦。

于 2012-05-07T12:48:17.493 回答
0

看起来 setup 是您的问题,并且在您想要的时候没有被调用。

我建议这样做:

CardTable aTable = new CardTable();

这样它就永远不会为空。

于 2012-05-07T13:22:11.840 回答
0

我遇到了同样的问题,我已经将 NUnit 框架版本从 3.7.1 回滚到 3.0.5,现在一切正常,没有例外。也许您应该回滚到以前版本的 NUnit 框架之一。

于 2017-08-19T18:24:24.133 回答