0

「Invite」という名前のメソッドを持つ「UserController」という名前のコントローラーがあります。私のコントローラーには、次のオーバーライドメソッドがあります。

DBRepository _repository;
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
    base.Initialize(requestContext);
            _repository = new DBRepository();

}

したがって、このメソッドは UserController クラスが作成されるたびに呼び出されます。

私のメソッド「Invite」には次の行があります。

var startTime = _repository.Get<AllowedTime>(p => p.TimeID == selectTimeStart.Value);

しかし、Unitメソッドを介してこのメ​​ソッドを呼び出そうとすると:

[TestMethod()]
[UrlToTest("http://localhost:6001/")]
public void InviteTest()
{
    UserController target = new UserController(); // TODO: Initialize to an appropriate value
    int? selectTimeStart = 57;
    int? selectTimeEnd = 61;
    Nullable<int> selectAttachToMeeting = new Nullable<int>(); // TODO: Initialize to an appropriate value
    int InvitedUserID = 9; // TODO: Initialize to an appropriate value
    UserInviteModel model = new UserInviteModel();
    model.Comment = "BLA_BLA_BLA";
    ActionResult expected = null; // TODO: Initialize to an appropriate value
    ActionResult actual;
    actual = target.Invite(selectTimeStart, selectTimeEnd, selectAttachToMeeting, InvitedUserID, model);
    Assert.AreEqual(expected, actual);
    Assert.Inconclusive("Verify the correctness of this test method.");
}

「参照が設定されていません...」というエラーが表示されました。なぜそれが起こるのか理解しています (私の場合は Initialize メソッドが呼び出されないため、_repository は null ですが、正しく行うにはどうすればよいですか?

4

1 に答える 1

1

テスト中に DBRepository がGetバッキング データ ストアから実際に を実行すると予想される場合は、_repositoryフィールドを に変更してLazy<DBRepository>、最初の使用時に初期化されるようにすることができます。(new現在のリクエストコンテキストに依存しているため、コンストラクターではなく Initialize メソッドで編集されていると思いますか?)

これを真の単体テストにしたい場合は、DBRepository クラスをまったくテストしないでください。モックアップできるインターフェイスにプログラミングする必要があります。DBRepositoryさらに、テストケースで提供できる場所から来るようにする必要があります。ファクトリでビルドするか、シングルトンとして提供することができます。また、テスト ケースでファクトリまたはシングルトンをセットアップして、事前にモック オブジェクトを提供することもできます。ただし、最善の方法は依存性注入を使用することです。そのため、new UserController().

于 2013-02-27T00:39:38.020 に答える