2

次のコードに単体テストを記述するにはどうすればよいですか。

public Image Get(BrowserName browser)
{
    // if no screenshot mode specified it means that regular screenshot needed
    return this.Get(browser, ScreenshotMode.Regular);
}

public Image Get(BrowserName browser, ScreenshotMode mode) {            
    // some code omitted here
}
4

2 に答える 2

3

これは通常、部分的なモックで行われますが、少し厄介な場合があります。

まず、モックするメソッドは仮想でなければなりません。そうしないと、Rhino Mocks はメソッドをインターセプトできません。それでは、コードを次のように変更しましょう。

public Image Get(BrowserName browser)
{
    // if no screenshot mode specified it means that regular screenshot needed
    return this.Get(browser, ScreenshotMode.Regular);
}

public virtual Image Get(BrowserName browser, ScreenshotMode mode) {            
    // some code omitted here
}

2 番目の方法は現在仮想であることに注意してください。次に、部分モックを次のようにセットアップできます。

//Arrange
var yourClass = MockRepository.GeneratePartialMock<YourClass>();
var bn = new BrowserName();
yourClass.Expect(m => m.Get(bn, ScreenshotMode.Regular));

//Act
yourClass.Get(bn);

//Assert
yourClass.VerifyAllExpectations();

これは、AAA Rhino Mocks 構文を使用したものです。録音/再生を使用したい場合は、それも使用できます。


それがあなたがそれをする方法です。おそらくより良い解決策は、ScreenshotModeが列挙型であり、C# 4 を自由に使用できる場合です。それをオプションのパラメーターにするだけです。

public Image Get(BrowserName browser, ScreenshotMode mode = ScreenshotMode.Regular)
{
    //Omitted code.
}

2 つのメソッドがなくなったので、1 つのメソッドが別のメソッドを呼び出していることをテストする必要はありません。

于 2012-08-09T16:01:37.270 に答える
1

メソッドを仮想化する以外に、さらに 2 つの可能性があります (vcsjones が説明したように):

1)

モードがレギュラーの Get(browser, mode) のテストを作成します。次に、Get (ブラウザ) に対して同じテストを実行します。

結局のところ、どちらもまったく同じ結果を返すはずです。

または 2)

2 番目の Get メソッドのコードをインターフェイスを持つクラスに抽出し、テスト対象のクラスに注入可能にします。次のように呼び出します。

public Image Get(BrowserName browser) {
  return whatever.Get(browser, ScreenshotMode.Regular);
}

public Image Get(BrowserName browser, ScreenshotMode mode) {   
  return whatever.Get(browser, mode);
}

これで、テスト中にモックを挿入して、最初の Get メソッドが ScreenshotMode.Regular でそれを呼び出し、2 番目の Get メソッドがモードを渡すだけであることを確認できます。

于 2012-08-09T16:24:19.810 に答える