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

问题描述

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

类用户

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 测试中的用户仍在内存中。我应该怎么做才能获得三个用户?我应该垃圾收集第一个鲍勃吗?

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

标签: c#mstest

解决方案


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

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

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

这样,每个单元测试都以“干净”状态运行,其中计数器将0在实际单元测试方法执行之前重置。

您可能想查看为什么在我的 Visual Studio 单元测试中每次测试都会触发 TestInitialize?看看这些属性是如何工作的。


推荐阅读