2016-04-19 8 views
0

Forループから10件の10件の結果をすべて取得しようとしています。しかし、私が走ると、初めての最初の結果が返されます。この状態のための助け、これは私の全体のコードです、 2ファイルが含まれて、私はそれを修正するために何度も試してみました。単体テストはループから10件の結果を返します

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

他の人の助けを借りてください:( –

+0

あなたが持っている問題は何ですか?また、MSTestのように見えますが、これは私が知っている限りパラメーター化された単体テストを許可していません。 「TestEveryDebit」は '[TestMethod']としてマークされるべきではないと考えてください。' TestAll'は '[TestMethod]'としてマークされ、 'TestEveryDebit'はおそらくプライベートであるべきです(私は思う) – Kritner

+0

また、あなたのforループを実行します。テストアサートがfalseを返すので、私はあなたがテストしているものについてはっきりしていません。 – Kritner

答えて

0

私はあなた(未遂)ループが達成されるだろう主張するものに本当に明確でないんだけど、一見2(または3)便利なユニットテストを持っているgetMoney方法は:

は量も大きいです私が持っているバランスよりも? - falseを返す

ゼロより少ない私の口座の残高は - falseを返す

私の量があまりにもが、以下の私のバランスですか? - これは間違っている、あなたがコード化されているロジックに付着しない - あなたは、単に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は常に失敗するテストを、あなたのためのループの中でいくつかの点で、あなたがしようとすることになるだろうあなたがbalanceを持っているよりも多くを取り出すためにamount

ループに基づいてAssertとすると、テストの「成功または失敗」は、個々のアサートではなく、全体に基づいています。したがって、ループが数回実行されても、テストは失敗します。

+0

どうすればこのエラーを処理できますか?なぜなら、テストエクスプローラにループで10件の結果を取りたいからです。私はtryキャッチを使うことができますか、結果が偽であっても、トラックを10回保持することができます。 –

+0

MSTestではできません。あなたはそれが意図されていない(私はまだ理解していない)方法でそれを使用しようとしています。 NUnitでパラメータ化されたテストを使用できます。 – Kritner

関連する問題