Tại sao bạn có mã phụ thuộc vào HostingEnvironment.MapPath trong ứng dụng ASP.NET MVC nơi bạn có quyền truy cập vào các đối tượng như HttpServerUtilityBase cho phép bạn đạt được điều này và có thể dễ dàng chế nhạo và thử nghiệm đơn vị?
Hãy lấy một ví dụ: một hành động điều khiển trong đó sử dụng lớp Server trừu tượng mà chúng tôi muốn kiểm tra đơn vị:
public class HomeController : Controller
{
public ActionResult Index()
{
var file = Server.MapPath("~/App_Data/foo.txt");
return View((object)file);
}
}
Bây giờ, có rất nhiều cách để đơn vị kiểm tra hành động điều khiển này. Cá nhân tôi thích sử dụng MVcContrib.TestHelper.
Nhưng hãy xem cách chúng tôi có thể thực hiện việc này bằng cách sử dụng khung mocking out-of-the-box. Tôi sử dụng Rhino Mocks ví dụ này:
[TestMethod]
public void Index_Action_Should_Calculate_And_Pass_The_Physical_Path_Of_Foo_As_View_Model()
{
// arrange
var sut = new HomeController();
var server = MockRepository.GeneratePartialMock<HttpServerUtilityBase>();
var context = MockRepository.GeneratePartialMock<HttpContextBase>();
context.Expect(x => x.Server).Return(server);
var expected = @"c:\work\App_Data\foo.txt";
server.Expect(x => x.MapPath("~/App_Data/foo.txt")).Return(expected);
var requestContext = new RequestContext(context, new RouteData());
sut.ControllerContext = new ControllerContext(requestContext, sut);
// act
var actual = sut.Index();
// assert
var viewResult = actual as ViewResult;
Assert.AreEqual(viewResult.Model, expected);
}
Nguồn
2012-01-05 12:09:23
Tại sao bạn có mã phụ thuộc vào 'HostingEnvironment.MapPath' trong ứng dụng ASP.NET MVC nơi bạn có quyền truy cập vào obj ects như 'HttpServerUtilityBase' cho phép bạn đạt được điều này và có thể dễ dàng chế nhạo và thử nghiệm đơn vị? Có lẽ bạn có thể hiển thị mã này và giải thích kịch bản để chúng tôi có thể cải thiện nó? –
@DarinDimitrov: Vì tôi không biết 'HttpServerUtilityBase'. Bạn có thể thêm một ví dụ? – jgauffin