web-dev-qa-db-ja.com

値をnullにすることはできません。パラメータ名:リクエスト

Nunitを使用して単体テストを作成していますが、このコードはすべて実行時に正常に機能します。

以下の保護されたHttpResponseMessageコードは、コントローラーが戻ったときにコントローラーによって呼び出されます。

ただし、エラー:

「値はnullにできません。パラメータ名:リクエスト」が表示されています。

リクエストを確認すると、実際はnullです。

質問:HttpResponseMessageを返すように単体テストをコーディングするにはどうすればよいですか?

エラーはこの行に表示されます:

  protected HttpResponseMessage Created<T>(T result) => Request.CreateResponse(HttpStatusCode.Created, Envelope.Ok(result));

これが私のコントローラーです:

    [Route("employees")]
    [HttpPost]
    public HttpResponseMessage CreateEmployee([FromBody] CreateEmployeeModel model)
    {
        //**Some code here**//

        return Created(new EmployeeModel
        {
            EmployeeId = employee.Id,
            CustomerId = employee.CustomerId,
            UserId = employee.UserId,
            FirstName = employee.User.FirstName,
            LastName = employee.User.LastName,
            Email = employee.User.Email,

            MobileNumber = employee.MobileNumber,
            IsPrimaryContact = employee.IsPrimaryContact,
            OnlineRoleId = RoleManager.GetOnlineRole(employee.CustomerId, employee.UserId).Id,
            HasMultipleCompanies = EmployeeManager.HasMultipleCompanies(employee.UserId)
        });
    }
15
user1960948

あなたが得ている理由:

タイプSystem.ArgumentNullExceptionの例外がSystem.Web.Http.dllで発生しましたが、ユーザーコードでは処理されませんでした追加情報:値をnullにすることはできません。

Requestオブジェクトがnullであるためです。

enter image description here

そのための解決策は、次のようなテストでコントローラーのインスタンスを作成することです。

    var myApiController = new MyApiController
    {
        Request = new System.Net.Http.HttpRequestMessage(),
        Configuration = new HttpConfiguration()
    };

このようにして、MyApiControllerクラスの新しいインスタンスを作成するときに、Requestオブジェクトを初期化しています。さらに、関連する構成オブジェクトを提供することも必要です。

最後に、Apiコントローラーの単体テストの例は次のようになります。

[TestClass]
public class MyApiControllerTests
{
    [TestMethod]
    public void CreateEmployee_Returns_HttpStatusCode_Created()
    {
        // Arrange
        var controller = new MyApiController
        {
            Request = new System.Net.Http.HttpRequestMessage(),
            Configuration = new HttpConfiguration()
        };

        var employee = new CreateEmployeeModel
        {
            Id = 1
        };

        // Act
        var response = controller.CreateEmployee(employee);

        // Assert
        Assert.AreEqual(response.StatusCode, HttpStatusCode.Created);
    }
}
19
Felipe Cruz

コントローラーを新規作成したときに、Requestプロパティ(HttpRequestMessage)をインスタンス化または割り当てていないことが何が起こっていると思います。ユニットテストでApiメソッドを呼び出す前にリクエストを指定することが必須であると思います。

構成(HttpConfiguration)も必要になる場合があります。

sut = new YourController()
    {
        Request = new HttpRequestMessage {
            RequestUri = new Uri("http://www.unittests.com") },

        Configuration = new HttpConfiguration()
    };

うまくいくかどうか教えてください。

3

また、コントローラにインジェクションがある場合は、次のことができます。

var controller= new MyController(injectionA, injectionB, injectionC)
{
    Request = new HttpRequestMessage(),
    Configuration = new HttpConfiguration()
};

私はそれらすべてを理解しやすい 公式ドキュメント で今見つけます。

0
PhoenixPan