0

私は単純な投稿を単体テストしています:

public HttpResponseMessage<Document> PostDocument(Document document) 
{
    document = repository.Add(document); 

    var response = new HttpResponseMessage<Document>(document, HttpStatusCode.Created); 

    var uri = Url.Route(null, new { id = document.Id }); 

    response.Headers.Location = new Uri(Request.RequestUri, uri); 

    return response; 
}

ただし、「URL」と「リクエスト」は明らかに null になります。

ControllerContext と HttpContext をモックアウトする代わりの方法はありますか?

アップデート:

次のように変更しました。

 public HttpResponseMessage<Document> PostDocument(Document document,Uri location = null) 
{
    document = repository.Add(document); 

    var response = new HttpResponseMessage<Document>(document, HttpStatusCode.Created);

    if (location == null)
    {
        var uri = Url.Route(null, new { id = document.Id });
        location = new Uri(Request.RequestUri, uri);
    }

    response.Headers.Location = location;

    return response; 
}

更新 2:

これの方が良い:

public HttpResponseMessage<Document> PostDocument(Document document)
{
    var uri = Url.Route(null, new { id = document.Id });
    var location = new Uri(Request.RequestUri, uri);

    return PostDocument(document, location);
}

[NonAction]
public HttpResponseMessage<Document> PostDocument(Document document, Uri location) 
{
    document = repository.Add(document); 

    var response = new HttpResponseMessage<Document>(document, HttpStatusCode.Created);
    response.Headers.Location = location;
    return response; 
}
4

3 に答える 3

1

FakeItEasy を使用して、TestInitialize でこれを行うことができました。

this.Controller.ControllerContext = new System.Web.Http.Controllers.HttpControllerContext();
this.Controller.Request = A.Fake<HttpRequestMessage>();
于 2013-01-16T21:33:18.087 に答える
1

プロパティはRequest設定可能でなければならないので、設定するだけで済みますControllerContext(これには引数なしのコンストラクターが必要なので、モックする必要さえありません)。

于 2012-02-28T16:22:47.830 に答える
0

メソッドは HttpRequestMessage をパラメーターとして受け取る場合があります。

 public HttpResponseMessage<Document> PostDocument(Document document, HttpRequestMessage message)
{

} 

そこから RequestUri を取得できます。単体テストでは、HttpRequestMessage オブジェクトのテスト ダブルを配置できます。

于 2012-03-20T16:11:54.543 に答える