单元测试只返回循环中10个案例的1个结果

时间:2016-04-19 13:41:45

标签: unit-testing assert

我试图从For循环获得10个案例的所有10个结果。但是当我跑步时,它只是为我返回第一次的第一次结果。对于这种情况的任何帮助,这是我的整个代码,它包括 2个文件,我已多次尝试修复它。

    //file BankAccount.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Bank //just want to demo this thing, it hasn't completed
{
    namespace BankAccountNS
    {
        public class BankAccount
        {
            private double m_balance;


            public BankAccount(double balance)
            {
                m_balance = balance;
            }

            public bool getMoney(double amount) //funtion get money from account
            {

                if (amount > m_balance || amount < 0) //check money
                {
                    return false;
                }
                return true;
            }
        }
    }
}


//file BankAccountTests.cs
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Bank.BankAccountNS;

namespace BankTest
{
    [TestClass]
    public class BankAccountTests
    {
        [TestMethod]
        public void TestEveryDebit(BankAccount Ba) //test every case from TestAll
        {
            Assert.IsTrue(Ba.getMoney(24000));
        }

        [TestMethod]
        public void TestAll() //create all cases
        {
            for(int i = 0; i < 10; i++)
            {
                BankAccount Ba = new BankAccount(23996 + i);
                TestEveryDebit(Ba);

            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我不清楚你的(尝试过的)循环断言会完成什么,但方法getMoney似乎有2(或3)个有用的单元测试:

  

金额是否大于我的余额? - 返回false

     

我的帐户余额是否小于零 - 返回false

     

我的金额是否小于或等于我的余额? - 返回true

在您当前的设置中(如果它可以工作)您只是测试getMoney对于甚至大于余额的金额返回true - 这是不正确的,并且不符合您编码的逻辑太

我看到您的单元测试看起来像:

    private double _balance = 50;
    private BankAccount _unitTestObject;

    [TestMethod]
    public void getMoney_returnsFalseWithInsufficientFunts() //create all cases
    {
        _unitTestObject = new BankAccount(_balance );
        var results = _unitTestObject.getMoney(_balance+1);

        Assert.IsFalse(results);
    }

    [TestMethod]
    public void getMoney_returnsFalseWhenAccountHasLessThanZero() //create all cases
    {
        _unitTestObject = new BankAccount(-1);
        var results = _unitTestObject.getMoney(1);

        Assert.IsFalse(results);
    }

    [TestMethod]
    public void getMoney_returnsTrueWhenAccountSufficientBalance() //create all cases
    {
        _unitTestObject = new BankAccount(_balance);
        var results = _unitTestObject.getMoney(_balance);

        Assert.IsTrue(results);
    }

正如我在评论中所述,MSTest无法进行参数化测试,而您尝试做的事情(断言特定逻辑10次)可以这样做:

[TestClass]
public class BankAccountTests
{

    [TestMethod]
    public void TestAll() //create all cases
    {
        for(int i = 0; i < 10; i++)
        {
            BankAccount Ba = new BankAccount(23996 + i);
            TestEveryDebit(Ba);

        }
    }

    private void TestEveryDebit(BankAccount Ba) //test every case from TestAll
    {
        Assert.IsTrue(Ba.getMoney(24000));
    }
}

测试TestAll将始终失败,因为在您的循环中的某个时刻,您将尝试取出更多内容amount balanceAssert

当{{1}}基于循环时,&#34;成功或失败&#34;测试的基础是整体,而不是每个人的断言。因此,即使你的循环运行了几次&#34;通过&#34;,测试也会失败。