2016-04-07 9 views
0

以下のサンプルメソッドがあり、テーブルが占有されているかどうかがチェックされます。ユニットテストを行うのは初めてのことですが、単体テストは単なるコードであり、データベースに対して実行されたアクションはすべて嘲笑されなければならないことをお読みください。そうでなければ、統合テストになります。誰かが私を正しい方向に向けることができれば、私はこれを嘲笑する方法についてはあまりよく分かりません。たとえば、あなたがあなたのクラスが実装すべきインタフェースを作成する必要がありますユニットテストのためのメソッドをモックするためにMS Accessデータベースに接続するメソッドをモックする方法

public bool isTableOccupied(string tableID) 
{ 
    bool tableOccupied = false; 
    try 
    { 
     connection.Open(); 
     using (OleDbCommand command = new OleDbCommand()) 
     { 
       command.Connection = connection; 
       command.CommandText = "SELECT [Occupied] FROM [Table] WHERE [TableID] [email protected]"; 
       command.Parameters.AddRange(new OleDbParameter[] { 
        new OleDbParameter("@TableID", tableID) 
        }); 
        OleDbDataReader reader = command.ExecuteReader(); 

        while (reader.Read()) 
        { 
         if (reader["Occupied"].ToString() == "True") 
         { 
          tableOccupied = true; 
         } 
        } 
      } 
      connection.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error " + ex); 
     } 
     return tableOccupied; 
} 

答えて

1

:第二に

public interface IRepository 
{ 
    bool IsTableOccupied(string tableId); 
} 

public class ExampleRepository : IRepository 
{ 
    public bool IsTableOccupied(string tableID) 
    { 
     // Your data access code goes here. 
    } 
} 

、あなたがして、インスタンスを「注入」する必要があり例えば、親を呼び出すコードのメソッドやクラスへのインタフェース、の:

public class ExampleBusiness 
{ 
    private readonly IRepository repository; 

    public ExampleBusiness(IRepository repository) 
    { 
     this.repository = repository; 
    } 

    public bool IsTableOccupied(string tableId) 
    { 
     return this.repository.IsTableOccupied(tableId); 
    } 
} 

あなたはその後、ヨーヨーをモックとし、そのような部品番号として、ユニットテストを書くとモックフレームワークを実装することができますur "isTableOccupied"メソッド:

// Create mock. 
var mockRepository = new Mock<IRepository>(); 

// Setup to return the desired mock value. In this case, return true if any string tableId is provided. 
mockRepository.Setup(x => x.IsTableOccupied(It.IsAny<string>())).Returns(true); 

// Call the parent method and inject the mock. 
var testBusiness = new ExampleBusiness(mockRepository.Object); 

// Finally, assert that the value is as expected. 
Assert.IsTrue(testBusiness.IsTableOccupied("TestId"); 
+0

このメソッドが他のメソッドとやり取りしない場合、これは価値があると思いますか?だから、戻り値は私が他のメソッドをテストするのを妨げない。私はこの方法の統合テストに直接向かい、ユニットテストをスキップする必要がありますか? – user5467760

+0

私がこのメソッドを嘲笑していると感じるのは、 'bool isTableOccupied(" tableID "){return true}'に変更することだけです。何かありますか? ' – user5467760

+0

これは確かにそれぞれの独自のシナリオに依存します。あなたのケースではそれほど価値はないかもしれませんが、インターフェイスの背後にあるデータアクセスコードを抽象化するのが一般的です。このコードは、あなた自身や他の人のために将来的には保守性とテスト可能性が高くなります。真実を返すために私が与えた例は単なる例でした。あなたは、与えられた特定のIDに依存して異なる値を返すようにモックを設定できます。私が言うように、それぞれのシナリオはユニークです。私はそれが価値を付加し、価値のあるものを表明しているかどうかだけをテストすると言うでしょう。しばしば統合テストがより有用になることがあります。 – abrown

関連する問題