0

コントローラー (MVC4) でメソッドの 1 つのテストを作成しようとしています。Moqを使用しています。テスト メソッド内で、次のようにリポジトリのモックを作成します。

Mock<ISurveyRepository> mock = new Mock<ISurveyRepository>();

リポジトリ呼び出しのモックアップに進みます。それらの最初のものは次のとおりです。

int userId = repository.GetUserId(User.Identity.Name);

したがって、これをテストメソッドに追加します。

mock.Setup(y => y.GetUserId("testName")).Returns(1);

残念ながら、このコード行は私に与えます:

System.NullReferenceException: Object reference not set to an instance of an object.

上記の行をコントローラーから削除し、代わりに静的な値 (int userId = 1) を使用すると、テストは正常に完了します。

誰でも理由を教えてもらえますか?

4

2 に答える 2

1

これは moq の問題を解決しないかもしれませんが、MvcContrib テスト ヘルパーは、ログインしているユーザーをモックするのに非常に役立ちます。

Test Helper を使用すると、次のようなコードを記述できます。

FakeIdentity FakeId = new FakeIdentity(UserName);
FakeUser = new FakePrincipal(FakeId, new[] {  "Admin" });   
Thread.CurrentPrincipal = FakeUser;

ユーザーをあざける。お役に立てれば。

于 2012-11-09T16:47:50.477 に答える
0

ユーザー名を取得しているときにコードが例外をスローします。User現在の HTTP リクエストからセキュリティ情報を返します。テスト中は HTTP リクエストがないため、このコードは例外をスローします。

このプロパティの実装は次のとおりです。

public IPrincipal User
{
    get
    {
        if (HttpContext != null)            
            return HttpContext.User;

        return null;
    }
}

したがって、ご覧のとおり、HttpContext がないと null が返されます。したがって、HttpContext をセットアップし、テスト用にモックを提供する必要がありますIPrincipal。偽の HttpContext を作成する方法については、こちらを参照してください。

于 2012-11-09T16:55:07.847 に答える