1

コントロールのコレクションを構成するメソッドをテストしようとしています。次の 2 つのメソッドを呼び出します。

  1. 元のコレクションをコピーします。
  2. 新しいコレクションを並べ替えます。

理想的には、コレクションを渡して、それが正しくソートされているかどうかをテストできるようにしたいと考えています。また、メソッド 1) が 2 回呼び出されていることも確認したいと思います。以下に基づく試行を参照してください。 RhinoMock を使用した例

MainPresenter のインスタンスを作成しようとすると、次のテストでエラーが発生します。エラーの一般的な要点は、「Moq.Mock から "FrazerMann.CsvImporter.UserInterface.IMainForm. + IFileDialog の同様のもの。

    [Test]
    public void ComposeCollectionOfControls_CallSequence_4Calls()
    {
        var main = new Mock<IMainForm>();
        var dialog = new Mock<IFileDialog>();
        var temp = new Mock<IMainPresenter>();

        temp.Setup(s => s.PopulateLists<Control>(It.IsAny<TableLayoutPanel>(), It.IsAny<List<Control>>()));

        var testObject = new MainPresenter(main.Object, dialog.Object);
        testObject.ComposeCollectionOfControls(It.IsAny<object>(), It.IsAny<EventArgs>());
        temp.Verify(v => v.PopulateLists<Control>(It.IsAny<TableLayoutPanel>(), It.IsAny<List<Control>>()), Times.Once());          
    }

ComposeCollectionOfControls をテストして、PopulateList() が 2 回呼び出されることを確認したいと思います。

public interface IMainPresenter
{
    void PopulateLists<T>(TableLayoutPanel userInputs, List<T> container) where T : Control;
    int SortList<T>(T control1, T control2) where T : Control;
}

public class MainPresenter:IMainPresenter
{
    UserInputEntity inputs;

    IFileDialog _dialog;
    IMainForm _view;

    public MainPresenter(IMainForm view, IFileDialog dialog)
    {
        _view = view;
        _dialog = dialog;
        view.ComposeCollectionOfControls += ComposeCollectionOfControls;
        view.SelectCsvFilePath += SelectCsvFilePath;
        view.SelectErrorLogFilePath += SelectErrorLogFilePath;
        view.DataVerification += DataVerification;
    }

    public void ComposeCollectionOfControls(object sender, EventArgs e)
    {
        PopulateLists<TextBox>(_view.ColumnNameCtrls, _view.SortedColumnNameCtrls);
        _view.SortedColumnNameCtrls.Sort(SortList<TextBox>);
        PopulateLists<ComboBox>(_view.ColumnDataTypeCtrls, _view.SortedColumnDataTypeCtrls);
        _view.SortedColumnDataTypeCtrls.Sort(SortList<ComboBox>);
    }
}

これをどのように行うべきかについて、誰かが私にいくつかの指針を教えてください。

4

1 に答える 1

3

Moq.Mock表示されているエラーは、Moq が作成するモック オブジェクトではなく、モック クラス自体 (タイプは ) を渡しているためです。

それ以外の:

var testObject = new MainPresenter(main, dialog);

必要なもの:

var testObject = new MainPresenter(main.Object, dialog.Object);

余談ですが、通常、特定のメソッドで行われた呼び出しの数などを明示的に検証することは、悪い習慣と見なされています。これにより、テストと特定の実装が密結合し、結果的にテストが脆弱になります。

メソッドを何回呼び出すかをテストすると、コードの最終結果がまだ正しい場合でも、一部のコードをリファクタリングした後にテストが失敗することがよくあります。

関連するオブジェクトの最終状態をテストし、どのようにしてその状態に到達したかをテストで無視する方がはるかに優れています。

于 2012-08-22T15:02:27.797 に答える