42

ASP.NET Web API の単体テストを使用してテスト ケースを作成しています。

これで、サービス層で定義したメソッドを呼び出すアクションができました。ここでは、次のコード行を使用しています。

string username = User.Identity.Name;
// do something with username
// return something

このための単体テスト メソッドを作成する方法について説明します。null 参照の例外が発生します。私は単体テストなどを書くのが初めてです。

これだけに単体テストを使いたいです。これについて私を助けてください。

4

8 に答える 8

47

以下は、これを行う 1 つの方法にすぎません。

public class FooController : ApiController {

    public string Get() {

        return User.Identity.Name;
    }
}

public class FooTest {

    [Fact]
    public void Foo() {

        var identity = new GenericIdentity("tugberk");
        Thread.CurrentPrincipal = new GenericPrincipal(identity, null);
        var controller = new FooController();

        Assert.Equal(controller.Get(), identity.Name);
    }
}
于 2012-10-08T12:45:37.777 に答える
17

NerdDinnerこれが、テストチュートリアルで見つけた別の方法です。私の場合はうまくいきました:

DinnersController CreateDinnersControllerAs(string userName)
{

    var mock = new Mock<ControllerContext>();
    mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(userName);
    mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);

    var controller = CreateDinnersController();
    controller.ControllerContext = mock.Object;

    return controller;
}

[TestMethod]
public void EditAction_Should_Return_EditView_When_ValidOwner()
{

    // Arrange
    var controller = CreateDinnersControllerAs("SomeUser");

    // Act
    var result = controller.Edit(1) as ViewResult;

    // Assert
    Assert.IsInstanceOfType(result.ViewData.Model, typeof(DinnerFormViewModel));
}

「 User.Identity.Nameプロパティのモック」のセクション全体を必ずお読みください。

これは、NuGetを使用してMoqインストールできるモックフレームワークを使用します:http: //nuget.org/packages/moqTest project

于 2012-11-03T18:00:47.960 に答える
11

WebApi 5.0 では、これは少し異なります。次のことができるようになりました。

controller.User = new ClaimsPrincipal(
  new GenericPrincipal(new GenericIdentity("user"), null));
于 2013-09-17T18:43:39.767 に答える
0

テストするコントローラーがたくさんある場合は、基本クラスを作成し、コンストラクターでGenericIdentity&GenericPrincipalとセットを作成することをお勧めしますThread.CurrentPrincipal

GenericPrincipal principal = new GenericPrincipal(new 
    GenericIdentity("UserName"),null); Thread.CurrentPrincipal = principal; 

次に、そのクラスを継承します..そのようにして、すべてのユニットテストクラスにプリンシパルオブジェクトセットがあります

[TestClass]
public class BaseUnitTest
{
    public BaseUnitTest()
    {
      GenericPrincipal principal = new GenericPrincipal(new GenericIdentity("UserName"),null);   
      Thread.CurrentPrincipal = principal;
    }
}


[TestClass]
public class AdminUnitTest : BaseUnitTest
{
   [TestMethod]
   public void Admin_Application_GetAppliction()
   {
   }
}
于 2014-05-15T03:03:32.710 に答える
0

ここで、テストメソッドからコントローラーレベルのテスト用にユーザー ID 名を設定する別の方法の解決策を見つけました。

public static void SetUserIdentityName(string userId)
        {
            IPrincipal principal = null;
            principal = new GenericPrincipal(new GenericIdentity(userId), 
            new string[0]);
            Thread.CurrentPrincipal = principal;
            if (HttpContext.Current != null)
            {
                HttpContext.Current.User = principal;
            }
        }
于 2014-04-01T12:28:58.223 に答える
0

単体テストを実行するとき - 私の場合は Windows 認証を使用し、Identity.Name は私のドメイン名であり、これもテスト用に変更したいと考えています。だから私は IAuthenticationFilter で欲しいものを「ハッキング」してそのようなアプローチを使用します

于 2017-08-11T08:45:34.223 に答える