2009-05-11 5 views
2

私は単体テストの初心者です。単体テストの手続きについて知りたがっています(この場合、プロシージャは「返す」ではなく「何か」する関数何か」。単位テスト手順(関数とは対照的に)

私は答えを返す関数をテストするための一般的な考え方は、

assert(yourfunction(sample, inputs) == expected_answer); 

のようなものであることを知っているが、何かが戻るか、または単にステータスコードを返していない場合は、これがどのように動作するか疑問に思って。

答えて

2

あなたはそれが何であるかをテストできる必要がありますs。たとえば、プロシージャはコレクションに何かを追加しますか?プロパティを設定しますか?ファイルを作成しますか?

それは何であれ、おそらく変更が表示されます何らかの形でです。その効果を確認する方法を検討するだけです。もちろん、これは時々行われるよりも簡単なことかもしれません。その理由は、機能的なアプローチが適切なときにテストする方が簡単です:)特に、外部リソース(ファイルシステム、データベースなど)とエフェクトを変更するエフェクトに依存します外部リソース(同上)は、「ローカル」なやり方で物事を変えるものよりもテストするのが難しいです。

1

場合によっては、他の依存関係のメソッドを呼び出すこともあります。そのような場合、依存性注入アプローチを使用している場合は、それらの依存関係のモックを渡して、アサーションまたは期待値を使用して、正しいパラメータを使用して依存性に対して正しいメソッドが呼び出されるようにすることができます。

1

プロシージャの場合、「do something」には通常、API呼び出しやその他のオブジェクト操作が含まれます。

たとえば、プロシージャは行をファイルに書き込むことがあります。これは、ファイルI/O API呼び出し(またはファイルIOオブジェクト)を使用して、この「行の書き込み」を行います。

あなたがしたいことは、ファイルのために立つための "モック"オブジェクトを作成することです。 Mockオブジェクトには、テスト結果を収集してアサーションに表示できるだけの機能があります。あなたのモックオブジェクトを上書きしないでください。失われた時間のラットホールです。

Pythonでは、このようなことを行います。

class MockFile(object): 
    def __init__(self, aFileName, aMode): 
     self.name= aFileName 
     self.mode= aMode 
     self.buffer= None 
    def write(self, aRow): 
     self.buffer= str(aRow) 

この模擬ファイルは、実際のファイルではなく、私たちの手続きに提供することができます。私たちは何が起こったのかをアサーションすることができます。

ケース1:

public class A 
    { 
     public void Foo() 
     { 
     Init(); 
     } 

     protected virtual void Init() 
     { 
     Do something; 
     } 
    } 

    [TestFixture] 
    public class ATests 
    { 
     [Test] 

     public void Foo_test() 
     { 
     A aStub = new A_Stub(); 
     aStub.Foo(); 
     Assert.IsTrue(aStub.wasInit); 
     } 

     public class A_Stub : A 
     { 
      public bool wasInit; 

      protected override void Init() 
      { 
      wasInit = true; 
      } 
     } 
    } 

ケース2:

class TestSomeProcedure(unittest.TestCase): 
    def testWrite(self): 
     mockFile= MockFile("name", "w") 
     theProcedureImTesting(args, args, args, mockFile) 
     self.assertEquals("The Row It Was Supposed to Write\n", mockFile.buffer) 
0

は、多くの異なる場合があります あなたの方法ではなく、同じクラスに属しているメンバーを実行する別のオブジェクトに依存します。この場合は、Mockフレームワークを使用することをお勧めします。私は個人的にRhino.Mocksを使用しています。このリンクをたどってRhino.Mocks examplesを見ることができます。

関連する問題