0

この動作を次のテスト ケースに分離しました。プロパティに設定されたプロパティを期待/検証する方法を教えてくれる人に感謝します-現在、私にはあまり意味をなさないList<T>内部で何かが起こっているようです. It.Is<T>(predicate)サンプル コードは VS2008 からコンソール アプリとして実行されます - Moq 2.6 への参照を追加する必要があります (私は 2.6.1014.1 を使用しています) - 何が起こっているかを確認するには、さまざまな ExpectSet ステートメントのコメントを外してみてください...

using System;
using Moq;
using System.Collections.Generic;

namespace MoqDemo {

    public interface IView {
        List<string> Names { get; set; }
    }

    public class Controller {
        private IView view;

        public Controller(IView view) {
            this.view = view;
        }

        public void PopulateView() {
            List<string> names = new List<string>() { "Hugh", "Pugh", "Barney McGrew" };
            view.Names = names;
        }

        public class MyApp {
            public static void Main() {
                Mock<IView> mockView = new Mock<IView>();

                // This works - and the expectation is verifiable.
                mockView.ExpectSet(mv => mv.Names);

                // None of the following can be verified.
                // mockView.ExpectSet(mv => mv.Names, It.Is<Object>(o => o != null));
                // mockView.ExpectSet(mv => mv.Names, It.Is<List<string>>(names => names.Count == 3));
                // mockView.ExpectSet(mv => mv.Names, It.IsAny<IList<String>>());

                Controller controller = new Controller(mockView.Object);
                controller.PopulateView();
                try {
                    mockView.VerifyAll();
                    Console.WriteLine("Verified OK!");
                } catch (MockException ex) {
                    Console.WriteLine("Verification failed!");
                    Console.WriteLine(ex.Message);
                }
                Console.ReadKey(false);
            }
        }
    }
}
4

4 に答える 4

1

ところで、It.IsはExpectSetではサポートされていません。コードは、(式ではなく)値として使用される場合は通常のメソッド呼び出しであるという理由だけでコンパイルされますが、Expectで使用される場合は、Moqによって前処理され、特定の意味が与えられます(すべてのItのnull /デフォルト値ではありません)。 。メンバーは実際に戻ってきますか)。

指定されたプロパティ(mockView.Stub(mv => mv.Names))でスタブ動作を使用し、後で実行後にその値を直接アサートすることができます。

于 2009-01-03T21:24:43.127 に答える
1

ExpectSet() の 2 番目のパラメーターは、期待する値です。It.Is<T>述語を取るオーバーロードがないため、この場合は使用できません-それはいいでしょう;)これは、サンプルからの(簡略化された)抜粋で、値の使用を示しています。

var mockView = new Mock<IView>();
var list = new List<string> { "Hugh", "Pugh", "Barney McGrew" };

mockView.ExpectSet(mv => mv.Names, list);

mockView.Object.Names = list;

それが役立つことを願っています。

編集:タイプミスを修正しました。

于 2008-12-11T01:27:37.827 に答える
1

私は最新バージョンの Moq を使用していないため、2 つのパラメーターを受け取る ExpectSet のオーバーロードはありませんが、このパターンである程度成功しています。

mockView.ExpectSet(mv => mv.Names).Callback(n => Assert.That(n != null));

.Names に割り当てられた値が述語と一致しない場合、コールバックの (NUnit からの) Assert 呼び出しは例外をスローします。ただし、テストが失敗したときに追跡するのは困難です。2 番目のパラメーターとして It.Is または It.IsAny を渡す機能が便利であることに同意します。

于 2008-12-11T01:53:37.900 に答える
0

Moqは、It.IsAnyを受け取るオーバーロードを提供しません。これは、期待値を渡さずにExpectSetを呼び出すのと実質的に同じであるためです;)

于 2009-01-03T21:17:11.877 に答える