死んだ質問を復活させる時が来ました
現在の回答はすべて、応答オブジェクトを既知の型にキャストすることに依存しています。残念ながら、応答には、コントローラーの実装に関する詳細な知識がなければ、これが機能するための使用可能な階層または暗黙的な変換パスがないようです。次の点を考慮してください。
public class MixedCodeStandardController : ApiController {
public readonly object _data = new Object();
public IHttpActionResult Get() {
return Ok(_data);
}
public IHttpActionResult Get(int id) {
return Content(HttpStatusCode.Success, _data);
}
}
クラスのテスト:
var testController = new MixedCodeStandardController();
var getResult = testController.Get();
var posRes = getResult as OkNegotiatedContentResult<object>;
Assert.IsType<OkNegotiatedContentResult<object>>(getResult);
Assert.AreEqual(HttpStatusCode.Success, posRes.StatusCode);
Assert.AreEqual(testController._data, posRes.Content);
var idResult = testController.Get(1);
var oddRes = getResult as OkNegotiatedContentResult<object>; // oddRes is null
Assert.IsType<OkNegotiatedContentResult<object>>(idResult); // throws failed assertion
Assert.AreEqual(HttpStatusCode.Success, oddRes.StatusCode); // throws for null ref
Assert.AreEqual(testController._data, oddRes.Content); // throws for null ref
ブラック ボックスの外側から見ると、応答ストリームは本質的に同じです。テストは、この方法でテストするために、コントローラーが return 呼び出しをどのように実装したかを知っている必要があります。
代わりに、返された IHttpActionResult の HttpResponseMessage オブジェクトを使用します。これにより、コントローラーのコードが次のようになっていない場合でも、テストの一貫性が保証されます。
var testController = new MixedCodeStandardController();
var getResult = testController.Get();
var getResponse = getResult.ExecuteAsync(CancellationToken.None).Result;
Assert.IsTrue(getResponse.IsSuccessStatusCode);
Assert.AreEqual(HttpStatusCode.Success, getResponse.StatusCode);
var idResult = testController.Get(1);
var idResponse = idResult.ExecuteAsync(CancellationToken.None).Result;
Assert.IsTrue(idResponse.IsSuccessStatusCode);
Assert.AreEqual(HttpStatusCode.Success, idResponse.StatusCode);