0

したがって、MSのすべての愚かな静的メソッドのために、MVCでのテストは苦痛ですが、私はそれのいくつかを回避することができました-私はそれをモックできるようにメンバーシップ用のインターフェイスを作成し、それはほとんど機能しますが、私はProfileBaseを使用しています私のカスタム UserProfile オブジェクトではもちろん、静的メソッドもあり、ProfileBase から継承するため、これははるかに困難です。日曜日全体を無駄にしてしまい、これをテストする方法がわかりません。

これが私の UserPofile クラスの外観です。これは、オンラインのすべての例とまったく同じです。

namespace TaskBoardAuth.Models
{
    public class UserProfile: ProfileBase
    {
        public static UserProfile GetUserProfile(string username)
        {
            return Create(username) as UserProfile;
        }

        public static UserProfile GetUserProfile()
        {
            return Create(Membership.GetUser().UserName) as UserProfile;
        }

        [SettingsAllowAnonymous(false)]
        public string FirstName
        {
            get { return base["FirstName"] as string; }
            set { base["FirstName"] = value; }
        }

        [SettingsAllowAnonymous(false)]
        public string LastName
        {
            get { return base["LastName"] as string; }
            set { base["LastName"] = value; }
        }

    }
}

問題は、これら 2 つのばかげたくだらない静的メソッドのためにテストできないことです。profileBase.Create() が静的であることは気にしないでください。エラー!それはとても愚かです!

とにかく - これが私が立ち往生している場所です - メソッドでこれを行う必要があります。

taskBoardModel.Name = UserProfile.GetUserProfile().FirstName + " " + UserProfile.GetUserProfile().LastName;

私の単体テストはもちろん、Membership.GetUser() の呼び出しが失敗するため失敗します。エラー!!!

誰にも何か提案がありますか?

4

1 に答える 1

2

この MVC のようなフレームワークの問題に対処するときは、通常、ラッパー クラスと、テスト/モックが必要な可能性がある内部クラスの周りに付随するインターフェイスを作成します。次に、コントローラーのコンストラクターに IUserProfile インターフェイスを挿入するように IoC コンテナーを構成します。したがって、単体テストでは、IUserProfile をモックして、必要なデータを提供するだけです。

Membership.GetUser() の問題は、ラッパー クラスとインターフェイスを作成することで同じ方法で解決できます。

以前はこのような問題を心配していましたが、今では気にせず、.NET のクレイジーなシール クラスや静的メソッドなどの周りにラッパー クラスを作成するだけです。

于 2012-07-16T05:05:13.823 に答える