3

特定のメソッド(ユニット)が正しいロジックを実行していることを確認するための最良の方法を探しています。

この場合、次のような方法があります。

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

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

ただし、Windows Phoneでは、モックフレームワークが動的プロキシを作成して通話を分析できる場合、ILの放出はある程度サポートされていません。そのため、これを手動で分析する必要があります。

簡単な解決策は、メソッドで呼び出された値をパブリックプロパティに保存し、Navigate(...)単体テストでそれらをチェックすることです。ただし、これは、さまざまな種類のモックや方法すべてに対して行う必要があるのはかなり面倒です。

だから私の質問は、リフレクションベースのプロキシを使用せず、デバッグ情報を手動で保存することなく、C#機能(デリゲートなど)を使用して分析呼び出しを作成するよりスマートな方法はありますか?

4

1 に答える 1

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.
    }
}

これは、次のようなテストで使用できます。

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

    // Act
    classUnderTest.GoToMyPage();

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

メソッドに渡されるパラメーターについては考えていませんが、これは良いスタートだと思います。

于 2012-04-12T13:12:17.277 に答える