2016-06-02 4 views
2

私はまだTDDへの道を辿っています。あなたのメソッドが多くのタスクを実行するように設計されている場合にTDDを使用する方法

ファイルが共有フォルダにアップロードされたときに起動されたSunSystemBrokerがあるとします。このブローカーは、このファイルを開き、そこからレコードを抽出し、別のシステムで関連する支払いを見つけようとし、最後にワークフローを呼び出すように設計されています。

IBroker.Process()メソッドを開発するためにTDDを実行したい場合はどうすればよいですか?

注:ブローカーは、IBrokerを継承し、コンソールアプリケーション(プラグインなど)でロードされる独立したアセンブリです。

このコンソールは、各ブローカーの起動を担当しています。

public interface IFileTriggeredBroker : IBroker 
{ 
    FileSystemTrigger Trigger { get; } 
    void Process(string file); 
} 

public class SunSystemPaymentBroker : IFileTriggeredBroker 
{ 
    private readonly IDbDatasourceFactory _hrdbFactory; 
    private readonly IExcelDatasourceFactory _xlFactory; 
    private readonly IK2DatasourceFactory _k2Factory; 
    private ILog _log; 

    public void Process(string file) 
    { 
     (...) 
     // _xlFactory.Create(file) > Extract 
     // _hrdbFactory.Create() > Find 
     // Compare Records 
     // _k2Factory.Create > Start 
    } 
} 

各メソッドを個別にテストされています。

は セブ

+0

これが実際にあなたの質問であるかどうかわかりません...私はいつも同じような質問をしてきました。 'Foo'、' Bar'、 'Baz'というメソッドがあり、それらは完全に自己完結型であり、単独で動作しますが、望ましい動作のためにそれらを連鎖させる必要がある場合、私は"連鎖 "責任はありますが、私は本当にこれらのクラスのクラスを何に呼び出すべきかは決して確かではありません。そして、それらをテストする限りでは、単に "Foo"、 "Bar"、 "Baz"から必要なメソッドをすべて呼び出す "chainer"を確保するだけですか? – Kritner

答えて

1

あなたは、各メソッドが言うことを考えます。あなたが部品番号のようなものを使用している場合

、あなたは呼び出しが発生していることを確認することができます

// Arrange 
const string File = "file.xlsx"; 
var xlFactory = new Mock<IExcelDatasourceFactory>(); 
var hrbdFactory = new Mock<IDbDatasourceFactory>(); 
var k2Factory = new Mock<IK2DatasourceFactory>(); 

// Act 
var sut = new SunSystemPaymentBroker(xlFactory.Object, hrdbFactory.Object, k2Factory.Object); // I'm assuming you're using constructor injection 
sut.ProcessFile(File); 

// Assert 
xlFactory.Verify(m => m.Create(File), Times.Once); 
hrbdFactory.Verify(m => m.Create(), Times.Once); 
k2Factory.Verify(m => m.Create(), Times.Once); 

は簡潔にするために、私は単一のテストとしてこれをやったが、シングル「アサート」で3つのテストに侵入します(verify呼び出し)が現実的です。 TDDの場合、その方法を配線する前に、各テストを書きます。Process(file)

具体的なバージョンのIExcelDatasourceFactoryIK2DatasourceFactoryIDbDatasourceFactoryを渡し、より深いところでシステムを実行する、より大きい統合レベルのテストが必要な場合もあります。本Growing Object-Oriented Software Guided by Tests

、これは作業が始まる前書き込まれるであろう、そして機能ながら失敗が全体的な機能に向かって働く機能の小さいTDDループに追加さ受け入れテストとして定義されるであろう。

1

を使用すると、2つの異なる問題持っていただきありがとうございます:)

1の方法は、多くのタスクは、あなたのコードはSOLID作成し、単一責任の原則を適用 実行するように設計されています。 1つの責任方法で分割します。つまり、1つのタスクのみを担当します。

2)純粋な関数ではなく、副作用(環境の変更)によって動作するプロシージャをテストしたい。 したがって、あなたのコードを純粋な関数呼び出しで分割するようにアドバイスします(つまり、副作用はありません)。 Process(file)以内にテストするための非常に少ないロジックがあり、

_xlFactory.Create(file); 
_hrdbFactory.Create(); 

// Compare Records 
_k2Factory.Create(); 

個別にテストされています

読むもhttps://msdn.microsoft.com/en-us/library/aa730844%28v=vs.80%29.aspx

+0

私のブローカーはすべて、彼らの目標は異なる仕事を達成することであるため、違います。コンソールアプリケーションは、(インターフェイスからの)プロセスメソッドについてのみ知っています。私は、メソッドExtractを呼び出してから、印刷して(...)呼び出す必要があることを知る方法がありません。ブローカーだけがそれを知っています。 – Seb

関連する問題