Не удается смоделировать контекст Owin в тестовом модуле службы REST C # WEB API
Я пытаюсь смоделировать контекст OWIN в службе CEST WEB API REST, но контекст OWIN всегда кажется нулевым. Я использую moq и .NET Framework 4.5.2.
Вот метод контроллера, который я пытаюсь проверить:
public class CustomerController : ApiController
{
// GET: api/Customer/n
[HttpGet]
[ClaimsPrincipalPermission(SecurityAction.Demand, Operation = Actions.View, Resource = Resources.Self)]
public IHttpActionResult Get(int id)
{
if (id <= 0)
return BadRequest();
ClaimsPrincipalPermission.CheckAccess(id.ToString(),"UserId");
string jsonResponse = string.Empty;
HttpStatusCode returnCode = this.ForwardGetRequestToWallet(String.Format("customer/gethistory/{0}", id), out jsonResponse);
if (returnCode== HttpStatusCode.OK)
return Ok(jsonResponse);
return StatusCode(returnCode);
}
И в вспомогательном классе код, который идет не так, при вызове controller.Request.GetOwinContext:
public static HttpClient GetClient(this ApiController controller)
{
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = controller.Request.Headers.Authorization;
var test = controller.Request.GetOwinContext().Request.RemoteIpAddress;
return client;
}
Мой тест инициализируется:
[TestInitialize()]
public void MyTestInitialize()
{
player_user_id = Convert.ToInt32(ConfigurationManager.AppSettings["PLAYER_USER_ID"]);
player_user_name = ConfigurationManager.AppSettings["PLAYER_USER_NAME"];
API_protocol = ConfigurationManager.AppSettings["WEB_API_PROTOCOL"];
API_host = ConfigurationManager.AppSettings["WEB_API_HOST"];
API_port = ConfigurationManager.AppSettings["WEB_API_PORT"];
wrapper = new ClaimsPrincipalWrapper();
server = new Mock<HttpServerUtilityBase>();
response = new Mock<HttpResponseBase>();
request = new Mock<HttpRequestBase>();
session = new Mock<HttpSessionStateBase>();
session.Setup(s => s.SessionID).Returns(Guid.NewGuid().ToString());
config = new HttpConfiguration();
owinContext = new Mock<IOwinContext>();
identity = new GenericIdentity(player_user_name);
identity.AddClaim(new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", player_user_id.ToString()));
principal = new GenericPrincipal(identity, new[] { "User" });
context = new Mock<HttpContextBase>();
context.SetupGet(c => c.Request).Returns(request.Object);
context.SetupGet(c => c.Response).Returns(response.Object);
context.SetupGet(c => c.Server).Returns(server.Object);
context.SetupGet(c => c.Session).Returns(session.Object);
context.SetupGet(p => p.User.Identity.Name).Returns(player_user_name);
context.SetupGet(p => p.Request.IsAuthenticated).Returns(true);
context.SetupGet(s => s.User).Returns(principal);
}
Мой тест:
[TestMethod]
public void Get()
{
var queryMock = new Mock<IReadableStringCollection>();
var requestMock = new Mock<IOwinRequest>();
requestMock.Setup(m => m.Query).Returns(queryMock.Object);
owinContext.Setup(m => m.Request).Returns(requestMock.Object);
testURI = new Uri(String.Format("{0}://{1}:{2}/Get/{3}", API_protocol, API_host, API_port, player_user_id));
request.Setup(r => r.Url).Returns(testURI);
message = new HttpRequestMessage(HttpMethod.Get, testURI);
var route = config.Routes.MapHttpRoute("Default", "api/{controller}/{id}");
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "customerController", "get" } });
var testControllerContext = new HttpControllerContext(config, routeData, message);
var controller = new SharedWalletAPI.Controllers.CustomerController()
{
ControllerContext = testControllerContext,
Request = new HttpRequestMessage(HttpMethod.Get, testURI),
User = new System.Security.Principal.GenericPrincipal(identity, new string[0])
};
// Act
var _result = controller.Get(player_user_id);
// get JSON
//CustomerHistoryList jsonObj = JsonConvert.DeserializeObject<CustomerHistoryList>(_result);
// Assert
Assert.IsNotNull(_result);
}
Все выглядит нормально, пока мы на самом деле не выполняем вызов get, а затем вызов GetWwinContext OWIN, который всегда возвращает значение null и, следовательно, выдает ошибку старого типа каштана «Ссылка на объект не установлена на экземпляр объекта».
Я все еще довольно новичок в OWIN. Кто-нибудь может посоветовать мне здесь?