2012-04-12 9 views
3

特定のメソッド(ユニット)が正しいロジックを実行しているかどうかを検証する最善の方法を探しています。この場合モックフレームワークなしでメソッド呼び出しとパラメータを確認する

、Iは、同様の方法があります

public void GoToMyPage() 
{ 
    DispatcherHelper.BeginInvoke(() => 
    { 
     navigationService.Navigate("mypage.xaml", "id", id); 
    }); 
} 

navigationServiceインターフェース、INavigationServiceの注入モックバージョンです。今、ユニットテストで正しいパラメータでNavigate(...)が呼び出されたことを確認したいと思います。

しかし、Windows Phone ILでは、発光しているフレームワークがダイナミックプロキシを作成してコールを分析できる程度では発光しません。そのため私はこれを手動で分析する必要があります。

簡単な解決策は、公開プロパティでNavigate(...)メソッドで呼び出された値を保存し、単体テストでチェックすることです。しかし、これはむしろ、さまざまな種類のモックやメソッドのためにやらなくてはなりません。

私の質問は、リフレクションベースのプロキシを使用せずに、C#機能(代理人など)を使用して解析コールを作成し、デバッグ情報を手動で保存することなくスマートな方法があるかどうかです。

+0

なぜパラメータを取得するためにリフレクションを使用したくないのですか? – Tigran

+0

私が書いたように、Windows Phoneはリフレクションベースの動的プロキシの作成をサポートしていません。 –

+0

あなたはEmitingについて言いましたが、私は実行時にデータを読み込むためのリフレクションの使用と、生成/注入しないことについて話しています。 – Tigran

答えて

3

私のアプローチは、呼び出しとパラメータをキャッチして後で検証できるように、INavigationServiceのテスト可能な実装を手動で作成することです。

public class TestableNavigationService : INavigationService 
{ 
    Dictionary<string, Parameters> Calls = new Dictionary<string, Parameters>(); 

    public void Navigate(string page, string parameterName, string parameterValue) 
    { 
     Calls.Add("Navigate" new Parameters()); // Parameters will need to catch the parameters that were passed to this method some how 
    } 

    public void Verify(string methodName, Parameters methodParameters) 
    { 
     ASsert.IsTrue(Calls.ContainsKey(methodName)); 
     // TODO: Verify the parameters are called correctly. 
    } 
} 

これは、あなたのテストでのようなものを使用することができます:私は、メソッドに渡されるパラメータについての考えをhaventは、私は、これは良いスタートだと思い

public void Test() 
{ 
    // Arrange 
    TestableNavigationService testableService = new TestableNavigationService(); 
    var classUnderTest = new TestClass(testableService); 

    // Act 
    classUnderTest.GoToMyPage(); 

    // Assert 
    testableService.Verify("Navigate"); 
} 

を。

+0

このアプローチの可能性は、実装上のコード生成であり、これは通常どおりコンパイルされるため、コンパイル時にモックフレームワークの柔軟性が得られます。 –