API コントローラーから継承するコントローラーの単体テストを示すサンプル コードはありますか? POST を単体テストしようとしていますが、失敗しています。テスト用に HttpControllerContext を設定する必要があると思いますが、方法がわかりません ありがとう
質問する
13953 次
4 に答える
10
このコードは、事後テストの基本を示す必要があります。コントローラーにリポジトリーが注入されていることを前提としています。ベータ版の Request.CreateResponse(... は少し違うので、声をかけてください...
次のようなコントローラーコードが与えられます。
public class FooController : ApiController
{
private IRepository<Foo> _fooRepository;
public FooController(IRepository<Foo> fooRepository)
{
_fooRepository = fooRepository;
}
public HttpResponseMessage Post(Foo value)
{
HttpResponseMessage response;
Foo returnValue = _fooRepository.Save(value);
response = Request.CreateResponse<Foo>(HttpStatusCode.Created, returnValue, this.Configuration);
response.Headers.Location = "http://server.com/foos/1";
return response;
}
}
単体テストは次のようになります (NUnit と RhinoMock)
Foo dto = new Foo() {
Id = -1,
Name = "Hiya"
};
IRepository<Foo> fooRepository = MockRepository.GenerateMock<IRepository<Foo>>();
fooRepository.Stub(x => x.Save(dto)).Return(new Foo() { Id = 1, Name = "Hiya" });
FooController controller = new FooController(fooRepository);
controller.Request = new HttpRequestMessage(HttpMethod.Post, "http://server.com/foos");
//The line below was needed in WebApi RC as null config caused an issue after upgrade from Beta
controller.Configuration = new System.Web.Http.HttpConfiguration(new System.Web.Http.HttpRouteCollection());
var result = controller.Post(dto);
Assert.AreEqual(HttpStatusCode.Created, result.StatusCode, "Expecting a 201 Message");
var resultFoo = result.Content.ReadAsAsync<Foo>().Result;
Assert.IsNotNull(resultFoo, "Response was empty!");
Assert.AreEqual(1, resultFoo.Id, "Foo id should be set");
于 2012-06-07T14:55:59.640 に答える
1
AutoFixtureを使用して、通常は次のようにします。
[Theory, AutoCatalogData]
public void PostToCollectionReturnsCorrectResponse(
CategoriesController sut,
CategoryRendition categoryRendition)
{
HttpResponseMessage response = sut.Post(categoryRendition);
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
}
このアプローチの詳細については、この他の SO の回答を参照してください。
于 2014-03-05T14:25:54.940 に答える