MSUnit 测试断言错误。我知道为什么,但我想不出如何解决它。帮助!我该怎么做才能断言 3 是用户数?

MSUnit test assertion is WRONG. I know why, but I can't think of how to fix it. Help! What can I do to get my assertion that 3 is the count of users?

我是单元测试的新手,需要一些帮助。这个例子仅供我学习,我实际上并没有计算静态变量中的用户数,因为我显然可以只使用 List 数据结构上的计数 属性。帮我弄清楚如何得到我原来的断言,即有 3 个用户。这是代码:

Class 用户

namespace TestStatic
{
    public class User
    {
        public string Name { get; set; }
        public int Dollars { get; set; }
        public static int Num_users { get; set; }

        public User(string name)
        {
            this.Name = name;
            Num_users++;
        }


        public int CalculateInterest(int interestRate)
        {
            return Dollars * interestRate;
        }
    }
}

使用 MSTest 进行测试

namespace TestStaticUnitTest
{
    [TestClass]
    public class CalcInterest
    {
        [TestMethod]
        public void UserMoney()
        {
            // arrange
            User bob = new User("Bob");
            bob.Dollars = 24;

            // act
            int result = bob.CalculateInterest(6);

            // assert
            Assert.AreEqual(144, result);

            //cleanup?
        }

        [TestMethod]
        public void UserCount()
        {
            // arrange
            List<User> users = new List<User>(){ new User("Joe"), new User("Bob"), new User("Greg") };

            // act
            int userCount = User.Num_users;

            // assert
            Assert.AreEqual(3, userCount);
        }
    }
}

UserCount 测试结果失败,因为存在第四个用户。来自 UserMoney 测试的用户仍在内存中。我应该怎么做才能获得三个用户?我应该对第一个 Bob 进行垃圾回收吗?

另外,我认为进入另一个测试的测试不是好的单元测试。我知道这可能是一个争论,但我会听取社区对此代码的任何建议。感谢您的帮助。

显而易见的解决方案是删除 static 计数器。如您所见,当您进入第二个单元测试方法 UserCount() 时,该计数器的值仍然是 1 从执行第一个单元测试方法 UserMoney() 之前。

如果您想保留计数器(出于学习目的以查看发生了什么),您可以使用清理方法,该方法将 "reset" 在 all 之前的环境或每个单元测试方法。在这种情况下,您希望为每个单元测试方法执行将计数器重置为 0。您可以通过编写一个带有 [TestInitialize] 属性的方法来实现:

[TestInitialize]
public void _Initialize() {
    User.Num_users = 0;
}

这样,每个单元测试都以 "clean" 状态运行,在执行实际单元测试方法之前,计数器将重置为 0

您可能想查看 Why does TestInitialize get fired for every test in my Visual Studio unit tests? 以了解这些属性的工作原理。