2016-04-19 6 views
0

Ich versuche, alle 10 Ergebnisse von 10 Fällen von For-Schleife zu erhalten. aber wenn ich renne, gibt es für mich einfach das erste Ergebnis des ersten Mals. jede Hilfe für diese Bedingung, das ist mein ganzer Code, es enthält 2 Dateien, ich habe versucht, es oft zu beheben.Unit Test gibt nur 1 Ergebnis von 10 Fällen aus Schleife

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

      } 
     } 
    } 
} 
+0

Hilfe von anderen :( –

+0

Was genau ist das Problem, das Sie haben? Auch das sieht aus wie MSTest, die soweit ich weiß parametrisierte Komponententests nicht zulassen. Wenn nichts anderes, würde ich Think 'TestEveryDebit' sollte nicht als '[TestMethod'] markiert werden.' TestAll' sollte weiterhin als '[TestMethod]' markiert werden und 'TestEveryDebit' sollte wahrscheinlich privat sein (glaube ich). – Kritner

+0

Auch wenn Sie es wollten folge deine FOR Schleife durch, irgendwann würde dein Test Assert false zurückgeben, also bin ich nicht wirklich klar was du testest – Kritner

Antwort

0

Ich bin nicht wirklich klar, was Ihre (versuchten) Schleife behauptet erreichen würde, aber die Methode getMoney scheinbar 2 (oder 3) nützliche Unit-Tests:

Ist die Menge größer als das Gleichgewicht, das ich habe? - return false

Ist mein Kontostand kleiner als Null -

Ist mein Menge von weniger als oder gleich zu meinem Gleichgewicht false zurück? - return true

In Ihrem aktuellen Setup (wenn es an der Arbeit war) Sie einfach zu test getMoney wahr kehren für Beträge noch größer als der Rest - das ist falsch und haftet nicht an die Logik, die Sie codiert haben auch.

Ich sehe die Komponententests, die wie:

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

Wie ich in den Kommentaren erwähnt, MSTest nicht parametrierbar Tests tun, und dem, was es sieht aus wie Sie versuchen, bestimmte Logik 10-mal zu tun (behaupten), wie dies geschehen könnte:

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

Aber den Test TestAll weil irgendwann in der Schleife nicht immer, Sie gehen zu versuchen, mehr herausnehmen amount als Sie haben balance.

Wenn der Test auf einer Schleife basiert, basiert der "Erfolg oder Misserfolg" des Tests auf dem Ganzen, nicht auf jeder einzelnen Behauptung. Auch wenn ein paar Durchläufe Ihrer Schleife "bestehen", wird der Test als Ganzes fehlschlagen.

+0

Also was kann ich tun, um diesen Fehler zu behandeln? weil ich Ergebnisse von 10 Fällen in der Schleife zum Testforscher nehmen möchte. kann ich try catch oder einen anderen Weg verwenden, um 10 mal in der Spur zu bleiben, auch wenn das Ergebnis falsch ist. –

+0

Sie können nicht, nicht mit MSTest. Du versuchst es auf eine Weise zu benutzen (die ich immer noch nicht verstehe), die nicht beabsichtigt war. Sie können parametrisierte Tests in NUnit verwenden. – Kritner