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.
sumber
GenericIdentity
konstruktor,IsAuthenticated
akan kembali salahHttpContextBase
, yang bisa diejek. Tidak perlu menggunakan solusi yang saya posting jika Anda menggunakan MVC. Jika Anda terus melakukannya, Anda mungkin perlu menjalankan kode yang saya posting sebelum Anda bahkan membuat controller.Di bawah Test Init juga akan melakukan pekerjaan.
sumber
System.Web
dalam proyek pengujian Anda?Saya tahu ini adalah subjek yang lebih tua, namun mengejek aplikasi MVC untuk pengujian unit adalah sesuatu yang kami lakukan secara teratur.
Saya hanya ingin menambahkan pengalaman saya Mengejek aplikasi MVC 3 menggunakan Moq 4 setelah memutakhirkan ke Visual Studio 2013. Tidak ada tes unit yang bekerja dalam mode debug dan HttpContext menunjukkan "tidak bisa mengevaluasi ekspresi" ketika mencoba mengintip variabel .
Ternyata studio visual 2013 memiliki masalah mengevaluasi beberapa objek. Agar debugging aplikasi web yang diolok-olok berfungsi lagi, saya harus memeriksa "Gunakan Mode Kompatibilitas Terkelola" di Alat => Opsi => Debugging => Pengaturan umum.
Saya biasanya melakukan sesuatu seperti ini:
Dan memulai konteks seperti ini
Dan memanggil Metode di controller lurus ke depan
sumber
Jika aplikasi pihak ketiga Anda mengarahkan ulang secara internal, maka lebih baik mengejek HttpContext dengan cara di bawah ini:
sumber