Saya mencoba menambahkan pengujian unit ke aplikasi ASP.NET MVC yang telah saya buat. Dalam pengujian unit saya, saya menggunakan kode berikut:
[TestMethod]
public void IndexAction_Should_Return_View() {
var controller = new MembershipController();
controller.SetFakeControllerContext("TestUser");
...
}
Dengan bantuan berikut untuk mengejek konteks controller:
public static class FakeControllerContext {
public static HttpContextBase FakeHttpContext(string username) {
var context = new Mock<HttpContextBase>();
context.SetupGet(ctx => ctx.Request.IsAuthenticated).Returns(!string.IsNullOrEmpty(username));
if (!string.IsNullOrEmpty(username))
context.SetupGet(ctx => ctx.User.Identity).Returns(FakeIdentity.CreateIdentity(username));
return context.Object;
}
public static void SetFakeControllerContext(this Controller controller, string username = null) {
var httpContext = FakeHttpContext(username);
var context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
controller.ControllerContext = context;
}
}
Kelas tes ini mewarisi dari kelas dasar yang memiliki yang berikut:
[TestInitialize]
public void Init() {
...
}
Di dalam metode ini ia memanggil perpustakaan (yang saya tidak punya kendali atas) yang mencoba menjalankan kode berikut:
HttpContext.Current.User.Identity.IsAuthenticated
Sekarang Anda mungkin dapat melihat masalahnya. Saya telah mengatur HttpContext palsu terhadap controller tetapi tidak dalam metode dasar Init ini. Unit testing / ejekan sangat baru bagi saya jadi saya ingin memastikan saya mendapatkan ini dengan benar. Apa cara yang benar bagi saya untuk mengejek HttpContext sehingga dibagi di controller saya dan semua perpustakaan yang disebut dalam metode Init saya.