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)
});
}
あなたが得ている理由:
タイプSystem.ArgumentNullExceptionの例外がSystem.Web.Http.dllで発生しましたが、ユーザーコードでは処理されませんでした追加情報:値をnullにすることはできません。
Request
オブジェクトがnull
であるためです。
そのための解決策は、次のようなテストでコントローラーのインスタンスを作成することです。
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);
}
}
コントローラーを新規作成したときに、Requestプロパティ(HttpRequestMessage
)をインスタンス化または割り当てていないことが何が起こっていると思います。ユニットテストでApiメソッドを呼び出す前にリクエストを指定することが必須であると思います。
構成(HttpConfiguration
)も必要になる場合があります。
sut = new YourController()
{
Request = new HttpRequestMessage {
RequestUri = new Uri("http://www.unittests.com") },
Configuration = new HttpConfiguration()
};
うまくいくかどうか教えてください。
また、コントローラにインジェクションがある場合は、次のことができます。
var controller= new MyController(injectionA, injectionB, injectionC)
{
Request = new HttpRequestMessage(),
Configuration = new HttpConfiguration()
};
私はそれらすべてを理解しやすい 公式ドキュメント で今見つけます。