11

MVC 5 を使用して Web API プロジェクトを最新バージョンにアップグレードしました。アプリケーションは正常に動作しますが、単体テストで次のコード行が機能しなくなりました。

string uri = this.Url.Link("DefaultApi", new { id = savedOrganization.Id });

コントローラーの Url プロパティが null になりました。これは、モック コントローラーを構成する方法です。

var config = new HttpConfiguration();
var request = new HttpRequestMessage(HttpMethod.Post, "http://xxx/api/organization");
var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}");
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary {{"controller", "organization"}});

controller.ControllerContext = new HttpControllerContext(config, routeData, request);
controller.Request = request;
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;
controller.Request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData;

MVC 5 にアップグレードする前は、正常に動作していました。

テストをデバッグすると、Url プロパティが null になっていることがわかります ここに画像の説明を入力

4

1 に答える 1

14

MVC 5 では Url プロパティが別の方法で作成されているようです。テストでこの行を導入したところ、Url プロパティが正常に戻りました

private static void SetupControllerForTests(ApiController controller)
{
    var config = new HttpConfiguration();
    var request = new HttpRequestMessage(HttpMethod.Post, "http://api.clientele-itsm.com/api/organization");
    var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}");
    var routeData = new HttpRouteData(route, new HttpRouteValueDictionary
    {
        {"id", Guid.Empty},
        {"controller", "organization"}
    });
    controller.ControllerContext = new HttpControllerContext(config, routeData, request);
    UrlHelper urlHelper = new UrlHelper(request);
    controller.Request = request;
    controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;
    controller.Request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData;
    /// inject a fake helper
    controller.Url = urlHelper;
}
于 2013-10-29T13:38:44.813 に答える