Пришел сюда для поиска решения. Это, похоже, работает, но не уверен, что есть лучший способ.
Контроллер необходим минимум CreateEntity
и GetKey
переопределениях:
public class MyController : EntitySetController<MyEntity, int>
{
protected override MyEntity CreateEntity(MyEntity entity)
{
return entity;
}
protected override int GetKey(MyEntity entity)
{
return entity.Id;
}
}
Где MyEntity очень просто:
public class MyEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
Похоже, вам нужно как минимум: + запрос с URI + 3 ключа в заголовке запроса, MS_HttpConfiguration
, MS_ODataPath
и MS_ODataRouteName
+ Конфигурация HTTP с маршрутом
[TestMethod]
public void CanPostToODataController()
{
var controller = new MyController();
var config = new HttpConfiguration();
var request = new HttpRequestMessage();
config.Routes.Add("mynameisbob", new MockRoute());
request.RequestUri = new Uri("http://www.thisisannoying.com/MyEntity");
request.Properties.Add("MS_HttpConfiguration", config);
request.Properties.Add("MS_ODataPath", new ODataPath(new EntitySetPathSegment("MyEntity")));
request.Properties.Add("MS_ODataRouteName", "mynameisbob");
controller.Request = request;
var response = controller.Post(new MyEntity());
Assert.IsNotNull(response);
Assert.IsTrue(response.IsSuccessStatusCode);
Assert.AreEqual(HttpStatusCode.Created, response.StatusCode);
}
Я не слишком уверен в IHttpRoute
, в исходном коде САШ (я должен был связать с этим, чтобы понять это все из) тесты используют издевается этого интерфейса. Поэтому для этого теста я просто создаю макет этого и реализую свойство RouteTemplate
и метод GetVirtualPath
. Все остальные на интерфейсе не использовались во время теста.
public class MockRoute : IHttpRoute
{
public string RouteTemplate
{
get { return ""; }
}
public IHttpVirtualPathData GetVirtualPath(HttpRequestMessage request, IDictionary<string, object> values)
{
return new HttpVirtualPathData(this, "www.thisisannoying.com");
}
// implement the other methods but they are not needed for the test above
}
Это работает для меня, однако я действительно не слишком уверен в ODataPath
и IHttpRoute
и как правильно его установить.
Спасибо за ваш ответ. Это выглядит хорошо для меня. В то же время я тестирую свой OData-контроллер с вызовом защищенных методов и доверяю правильной реализации из команды Web.API и в своих тестах интеграции. –