私はAsp.net MVC 5プロジェクトで作業しています。コントローラ内でカスタムプリンシパルを返すようにモックをセットアップしようとしています。私は検索して、別のアプローチを試してみましたが、どれもうまくいきません。HttpContext.Userを模擬する方法
私はすべての私のコントローラが継承するBaseControllerを持っています。 BaseControllerには、getterのHttpContext.Userを返すUserプロパティがあります。 HttpContext.userはプロジェクト内で呼び出されたときに値を返しますが、単体テストプロジェクトからの呼び出しではnullを返します。
BaseController
public class BaseController : Controller
{
protected virtual new CustomPrincipal User
{
get { return HttpContext.User as CustomPrincipal; } ***<== Line with issue***
}
}
カスタム校長
public class CustomPrincipal : IPrincipal, ICustomPrincipal
{
public IIdentity Identity { get; private set; }
public string UserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool IsStoreUser { get; set; }
public CustomPrincipal(string username)
{
this.Identity = new GenericIdentity(username);
}
}
コントローラ
public class DocumentsController : BaseController
{
public ViewResult ViewDocuments()
{
var userType = User.IsStoreUser ? UserType.StoreUser : UserType.Corporate; ***<== User is null when calling from a unit test.***
}
}
テストケース
[Test]
public void ViewDocuments_WhenCalled_ShouldReturnViewModel()
{
// Arrange
var principal = new CustomPrincipal("2038786");
principal.UserId = "2038786";
principal.FirstName = "Test";
principal.LastName = "User";
principal.IsStoreUser = true;
var _mockController = new Mock<DocumentsController>(new UnitOfWork(_context)) { CallBase = true };
_mockController.Setup(u => u.User).Returns(principal); ***<== Error - "Invalid setup on a non-virtual (overridable in VB) member: u => u.User"***
// Act
var result = _controller.ViewDocuments();
}
私はモックオブジェクトを作成するためにNUnitのと部品番号を使用していますが、私が間違ってやっている私はわかりません。テストで作成したカスタムプリンシパルオブジェクトのIsStoreの値を返すには、DocumentControlでUser.IsStoreの戻り値を嘲笑する必要があります。
Nkosiありがとう、これは素晴らしい作品です。あなたの助けと提案に感謝します。 –