MVC 3 미리보기 1을 사용하여 새로운 면도기 뷰 엔진을 시험해보고 NUnit/Moq를 사용하여 간단한 단위 테스트를 작성하고 싶습니다. Razor의 실제 판매 기능 중 하나인데도 실제로이 작업이 아직 수행되지 않은 사례는 없습니다.면도기 기반 뷰에 대한 단위 테스트를 작성하기위한 포인터가 필요합니다.
컨트롤러가있는 경우 DBConext 개체 (EF4 CTP 코드)가 먼저 사용되며 컨트롤러에서 호출 된 모델에 제공된 항목 목록에 따라 드롭 다운 목록이 렌더링됩니다 요소에 항목이 채워져 있는지 테스트 할 수 있기를 바랍니다. 여기
public class WeatherReportController : Controller, IWeatherReportController
{
private IWeatherDb _weatherDb;
public WeatherReportController()
{
this._weatherDb = new WeatherDb();
}
public ActionResult Index()
{
WeatherReportIndexModel model = new WeatherReportIndexModel
{
Report = new WeatherReport {
Username = this.HttpContext.User.Identity.Name,
WeatherType = new WeatherType()
},
WeatherTypeList = _weatherDb.GetAllWeatherTypes()
};
return View(model);
}
}
내 모델의 :
public class WeatherReportIndexModel
{
private IList<WeatherType> _weatherTypeList = new List<WeatherType>();
public IList<WeatherType> WeatherTypeList {
get
{
return _weatherTypeList;
}
set
{
_weatherTypeList = value;
}
}
[DisplayName("Type of Weather")]
public IList<SelectListItem> WeatherTypeSelectItemList
{
get
{
int id = this.Report.WeatherType == null ? 0 : this.Report.WeatherType.WeatherTypeId;
List<SelectListItem> selectListItems = this.WeatherTypeList.Select(weatherType => new SelectListItem
{
Value = weatherType.WeatherTypeId.ToString(),
Text = weatherType.Name,
Selected = weatherType.WeatherTypeId == id
}).ToList();
selectListItems.Insert(0, new SelectListItem { Selected = (this.Report.WeatherType == null), Text = "Select Type of Weather", Value = "0" });
return selectListItems;
}
}
public WeatherReport Report { get; set; }
}
그리고 여기 내보기입니다 :
다음과@inherits System.Web.Mvc.WebViewPage<Web.UI.Models.WeatherReportIndexModel>
@{
View.Title = "Index";
LayoutPage = "~/Views/Shared/_Layout.cshtml";
}
<h2>Index</h2>
@using (Html.BeginForm()) {
<div>
<fieldset>
<legend>New Weather Report</legend>
<div class="editor-label">
@Html.LabelFor(m => m.Report.WeatherType.WeatherTypeId)
@Html.DropDownListFor(m => m.Report.WeatherType.WeatherTypeId, Model.WeatherTypeSelectItemList)
<input type="submit" value="Log On" />
</div>
</fieldset>
</div>
}
내가 지금까지 가지고있는 테스트 코드가 될 때 : 여기
내 컨트롤러의[TestFixture]
public class WeatherReportViewTests
{
[Test]
public void Can_render_weather_report_index_view_correctly()
{
var mockControllerContext = new Mock<ControllerContext>();
var mockSession = new Mock<HttpSessionStateBase>();
mockControllerContext.Setup(p => p.HttpContext.Request.HttpMethod).Returns("POST");
mockControllerContext.Setup(p => p.HttpContext.Request.UserHostAddress).Returns("1.1.1.1");
mockControllerContext.Setup(p => p.HttpContext.Session).Returns(mockSession.Object);
mockControllerContext.Setup(p => p.HttpContext.Request.LogonUserIdentity).Returns(WindowsIdentity.GetCurrent());
var routeData = new RouteData();
routeData.Values.Add("controller", "WeatherReport");
routeData.Values.Add("action", "Index");
var viewEngine = new CshtmlViewEngine();
var view = viewEngine.FindView(mockControllerContext.Object, "Index", "_Layout", false);
var viewReponse = view.ToString();
Assert.That(viewReponse, Contains.Substring("Sunny Intervals"));
}
}
테스트를 실행할 때 NullReferenceException이 발생합니다.
모든 아이디어/포인터 등을 환영합니다. 나는 미래에 내 의견에 TDD를 할 수 있도록이 일을하고 싶습니다.
미리 감사드립니다.
죄송합니다. 내 테스트 코드를 업데이트 했는데도 여전히 내 머리를 긁적입니다. ( – dextermixwith
아직 행운이 있습니까? 이 기능을 공유 할 수있는 방법을 찾았습니다 ... thx –